Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > перехват WSArecv


Автор: bass 22.5.2012, 17:43
Ребят выручайте что не так написал ??????? 
WSAsend Таким макаром отлично работает а вот wsarecv не работает.......((((((((( 

EventTranslete2(lpBuffers->len,lpBuffers->buf ); Функция отправки пакета моему приложению ..... Работает.....

WSARecvZ родной вызов ...........


Причем приложение нормально работает, смотрю отладчиком lpBuffers->len равняеться 2,
lpBuffers->buf указывает фиг знает на что.........((((((((((

Причем функция перехвата wsasend работает замечательно, а параметры у нее такиеже...... 


Код

extern "C" __declspec(dllexport)int __stdcall   WSARecv   (  HANDLE Socket,LPWSABUF lpBuffers,DWORD dwBufferCount,
LPDWORD lpNumberOfBytesSent,DWORD dwFlags,DWORD lpOverlapped,DWORD lpCompletionRoutine)
{
DWORD Result = 0;
DWORD BufferLeghtSend = 1000;



Result =  WSARecvZ     (Socket,lpBuffers,dwBufferCount,lpNumberOfBytesSent,dwFlags,lpOverlapped,lpCompletionRoutine);

if (Result != SOCKET_ERROR) 
{

    if(SocketOpen == Socket)
    {
    //EventTranslete2(BUFFERLenght,(char*)BUFFERSEND );
    EventTranslete2(lpBuffers->len,lpBuffers->buf );
    }
}
return Result;
}



Заранее спасибо...

Автор: xvr 22.5.2012, 17:59
Цитата(bass @  22.5.2012,  17:43 Найти цитируемый пост)
WSAsend Таким макаром отлично работает а вот wsarecv не работает

В чем заключается 'не работает'? Не попадают данные в приложение через EventTranslete2? Возможно WSARecv  вызывают в Overlapped режиме и реальная передача данных происходит в другом месте


Автор: bass 22.5.2012, 18:40
О ...... Спасибки скорее всего так и есть а значит сообщение у нас находиться в прошлом буффере попробую выкрутиться так............. В отладчике его и видел тролько новый буфер указыват на какойто мусор........
Связь этого преложения только через один сокет.... Может и получиться .....
А правильнее как выкручиваться в такой ситуации???

Автор: bass 22.5.2012, 20:26
lpOverlapped = 0 .....Посмотрел отладчиком..... Тогда вообще не чего не пойму.......................... Значит буффер должен заполняться привызове функции....

dwBufferCount = 1......

Вчем косяк то????? smile  smile  smile  smile  smile 

Автор: feodorv 22.5.2012, 20:35
Цитата(bass @  22.5.2012,  21:26 Найти цитируемый пост)
Посмотрел отладчиком.....

А чему равно Result? Дело в том, что сокет может находится в асинхронном режиме. Программа выдаёт запрос на чтение, а в буфере приёма сокета пусто. Синхронный сокет в таком случае просто ждал бы прихода каких-нибудь данных. А асинхронный возвращает SOCKET_ERROR с ошибкой WSAEWOULDBLOCK. 

Автор: bass 22.5.2012, 22:19
Смотрел.... В мою программу какоето г..... Приходит пардон за выражение..... По два байта...... В тот момент когда я посылаю соообщение этой программе...........

И в коде стоит........ ТОгдабы не чего не приходило..................
if (Result != SOCKET_ERROR) 
{

Автор: feodorv 22.5.2012, 22:56
Цитата(bass @  22.5.2012,  23:19 Найти цитируемый пост)
И в коде стоит........ ТОгдабы не чего не приходило..................

Ну, просто не совсем внятно написано, что и когда происходит.

Первое, что бросается в глаза - прототип функции WSARecv. Должно быть:
Код

int WSARecv(
  SOCKET s,
  LPWSABUF lpBuffers,
  DWORD dwBufferCount,
  LPDWORD lpNumberOfBytesRecvd,
  LPDWORD lpFlags,
  LPWSAOVERLAPPED lpOverlapped,
  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);


У Вас:
Цитата

extern "C" __declspec(dllexport) 
int __stdcall WSARecv(  
  HANDLE Socket,
  LPWSABUF lpBuffers,
  DWORD dwBufferCount,
  LPDWORD lpNumberOfBytesSent,
  DWORD dwFlags,
  DWORD lpOverlapped,
  DWORD lpCompletionRoutine);

Поправьте, пожалуйста smile 

Автор: bass 26.5.2012, 16:25
А какая разница ...... .. Их можно было и DWORD Все обозвать кроме воторого.......... Что пишло по стеку то и ушло на вызов родной (Может это с точки программирования не корректно )......
Главное соглашение о вызове чтоб одинаковое было....... И не слетал стек........ Самое что удивительное...... По отладчиком все работает..... Вот это незадача........    smile  smile  smile  

Автор: feodorv 26.5.2012, 19:26
Цитата(bass @  26.5.2012,  17:25 Найти цитируемый пост)
Их можно было и DWORD Все обозвать кроме воторого..........

Это если у Вас 32-битная система  smile Я ж не в курсе... Но привести к одинаковым типам стОит...

Автор: bass 26.5.2012, 20:08
Цитата(feodorv @ 26.5.2012,  19:26)
Цитата(bass @  26.5.2012,  17:25 Найти цитируемый пост)
Их можно было и DWORD Все обозвать кроме воторого..........

Это если у Вас 32-битная система  smile Я ж не в курсе... Но привести к одинаковым типам стОит...

Да 32ти двух битная........  Как я и писал с точки зрения программирования .....
(Может это с точки программирования не корректно )....
Сейчас интересует почему работает не корректно.........    
Только вот под отладчиком все работает....
Буду пробывать поставить паузы.............

Система ХР....

Спасибо за помощь...

Автор: feodorv 26.5.2012, 22:06
Честно говоря, я не могу понять, почему так сложно подправить всего одну строчку, прикрываясь "да какая разница". А может есть? Вы проверяли? Вы указатель на callback-функцию превратили в DWORD. Откуда Вы знаете, что там с этим натворит компилятор? Просто проверьте и исключите такую возможность, это же не сложно...
 smile 

Автор: bass 27.5.2012, 08:16
Цитата(feodorv @ 26.5.2012,  22:06)
 Откуда Вы знаете, что там с этим натворит компилятор? 
 smile

Отладчиком посмотрел что все переменные передаються в целостности и сохранности...... Олькой .....

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

Сейчас я думаю не кто мне не поможет кроме самого себя...... Сначало подумал в функции дело........ А оказалось на много сложнее.....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)