Отправка строки с помощью сокетов (не так просто!)

2

Я использую Nektra Deviare для вызова вызовов метода Winsock. Моя идея - научиться также отправлять сообщения через один и тот же сокет, чем исходное приложение. Так что я делаю, когда обнаруживаю первый вызов для отправки сообщения, я сохраняю идентификатор сокета (первый аргумент функции отправки), поэтому я могу использовать его позже.

Итак, вот мой код:

    uint socket = 0;

[DllImport("Ws2_32.dll")]
private static extern int send(uint socket, string buf, int len, int flags);

void _proxy_OnFunctionCalled(DeviareTools.IProcess proc, DeviareParams.ICallInfo callInfo, Deviare.IRemoteCall rCall)
{
   socket = (uint)callInfo.Params.get_Item(0).Value;
}

и позже

    int ret = send(socket, "ABC", 3, 0);
    MessageBox.Show(ret.ToString());

Это последнее сообщение появляется всегда -1. Почему это должно быть?

Спасибо

edit: вызов WSAGetLastError() возвращает 2. Которое я не знаю, что это значит, поскольку оно не похоже на msdn.

Теги:
sockets
hook

3 ответа

1

Попробуйте сделать

MessageBox.Show(socket.ToString());

и убедитесь, что ваша переменная сокета установлена.

Я считаю, что ошибка 2 - это "файл не найден", который подскажет мне, что у вас есть недопустимый идентификатор сокета, но я мог ошибаться в этом.

  • 0
    Это имеет какое-то значение, 1564, прямо сейчас.
  • 0
    Ну, я установил значение сокета в 123, и это выскакивает та же ошибка. Странный. Так может быть это как-то связано с неверным идентификатором сокета? Я не понимаю почему.
0

Возможно, это немного поздно, но проблема в том, что вы пытаетесь использовать сокет, созданный в другом процессе. Используя Deviare, вы получаете идентификатор сокета из одного процесса, и вы пытаетесь использовать его в своем процессе. Это не работает, потому что идентификаторы сокетов действительны только в том процессе, в котором они были созданы.

0

WinSock должен быть инициализирован, необходимо создать сокет, необходимо установить соединение (если ваш сокет не является SOCK_DGRAM), так что вы можете отправить() что угодно. Кроме того, функции API предназначены для работы с данными из указателей (char *), гарантируя, что это происходит. Возможно, "ABC" объявляется как массив WIDECHAR, объект String или что-то вроде буфера (char *).

Здесь присутствует полный пример базового соединения сокетов в MSDN: http://msdn.microsoft.com/en-us/library/ms737625(VS.85).aspx

  • 0
    Я думаю, что не нужно ничего инициализировать, помните, что я использую идентификатор сокета, который уже был создан.
  • 0
    Да, но я думаю, что вы не поняли. Я не спрашиваю, как отправить информацию с сокетами, я прошу hwo отправить информацию после того, как у меня есть идентификатор сокета, который я получил, перехватывая другое приложение.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню