我需要弄清楚当 lpCompletionRoutine 为空时 WSARecv 如何使用 lpOverlapped 参数。它表示位于 lpOverlapped 的事件,对吧?但肯定不止于此。
我正在拦截正常的 WSARecv 调用,因此我可以记录数据包,并且我可以很好地捕获数据,但是客户端挂起并等待被告知 recv 操作已完成。我只是不知道真正的 WSARecv 函数究竟用 lpOverlapped 做什么来通知客户端操作已完成。
当 lpOverlapped 被传递到 WSARecv 时,lpOverlapped->hEvent 为空。所以我不能简单地执行 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
}
最佳答案
在设置重叠结构时,您必须手动创建(然后关闭)事件。该事件由操作系统设置 - 您只需等待或检查即可。
如果重叠结构的事件为NULL,您仍然可以使用套接字本身等待套接字事件。
关于c++ - WSARecv 如何使用 lpOverlapped?我怎样才能手动发出事件信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7140695/