2009-08-20 3 views
2

Я использую Deviare от Nektra, чтобы перехватывать вызовы метода 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()); 

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

Благодаря

редактировать: вызов WSAGetLastError() возвращает 2. Что я не знаю, что это значит, как это, кажется, не появляются на сайте MSDN.

ответ

1

Try делает

MessageBox.Show(socket.ToString()); 

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

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

+0

Он имеет некоторое значение, 1564, прямо сейчас. –

+0

Ну, я установил значение сокета на 123 и он выдает ту же ошибку. Странный. Возможно, это связано с тем, что идентификатор сокета недействителен? Я не понимаю почему. –

0

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

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

+0

Я думаю, что мне не нужно ничего инициализировать, помните, что я использую ID сокета, который уже создан. –

+0

Да, но я думаю, вы не понимаете. Я не спрашиваю, как отправлять информацию с сокетами, я прошу hwo отправить информацию после того, как у меня есть идентификатор сокета, который я подключил к другому приложению. –

+0

Он должен работать очень хорошо, если бы он был реальным и готовым к отправке сокета данных. Может быть, вы делаете что-то еще неправильно. Я скорее создаю свои собственные методы для материала APIHook, на самом деле я уже сделал фильтры безопасности и анти-мошеннические решения для игровых серверов, не имея доступа к их коду, только используя APIHook. – Havenard

0

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