当lpCompletionRoutine为null时,我需要弄清楚WSARecv如何使用lpOverlapped参数。它标志着位于lpOverlapped的事件,对吗?但必须有更多的东西。
我正在拦截正常的WSARecv调用,所以我可以记录数据包,我可以很好地捕获数据,但客户端挂起并等待被告知recv操作已完成。我根本不确切知道真正的WSARecv函数用lpOverlapped做什么来通知客户端操作已完成。
当lpOverlapped传递给WSARecv时,lpOverlapped-> hEvent为null。所以我不能简单地做SetEvent()或WSASetEvent()。我可以通过执行类似lpOverlapped-> hEvent = WSACreateEvent()的操作来创建事件,然后设置事件,客户端似乎仍然不会确认它。
感谢任何帮助。
谢谢!
编辑:我正在为WSARecv调用做什么的示例
int proxyWSARecv(int unused, SOCKET s, LPWSABUF recvBuffer, DWORD bufferCount, LPDWORD bytesRecvd, LPDWORD flags,
LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine){
WSAOVERLAPPED wsaoverlapped;
LPWSAOVERLAPPED ourOverlapped = &wsaoverlapped;
WSADATA wsaData;
int rc = WSAStartup(MAKEWORD(2, 2), &wsaData);
int retnVal;
__asm{
push lpCompletionRoutine
push ourOverlapped // our replacement lpoverlapped
push flags
push bytesRecvd
push bufferCount
push recvBuffer
push s
call p_WSARecv // real WSARecv
mov retnVal, EAX
}
// get overlapped results and log packets here. etc
}
答案 0 :(得分:0)
在设置重叠结构时,您必须手动创建(并稍后关闭)事件。该事件由操作系统设置 - 您只需等待或检查它。
如果重叠结构的事件为NULL,您仍然可以使用套接字本身等待套接字事件。