应用程序如何使用WSA_IO_PENDING恢复数据?

时间:2014-05-06 10:46:44

标签: winapi networking spi iocp sniffer

我使用LSP / SPI为指定的应用程序制作嗅探器。但我不明白这个应用程序如何与网络协同工作。

没有" connect"或WSAConnect调用。我拦截了WSPRecv,WSPSend,WSPCloseSocket,但没有WSPConnect。

另一个奇怪的事情 - WSPRecv总是返回WSA_IO_PENDING,但lpOverlapped中的hEvent为null,lpCompletionRoutine也为null。并且没有调用WSPGetOverlappedResult(WSAGetOverlappedResult,GetOverlappedResult)和GetQueuedCompletionStatus(GetQueuedCompletionStatusEx)。我搞了所有这些功能,但根本没有通话!该应用程序如何收集数据?

你能帮帮我吗?它是如何工作的?我错过了什么?

1 个答案:

答案 0 :(得分:0)

父进程侦听连接。建立连接后,父进程会启动一个新的子进程来处理连接。子进程继承连接套接字的句柄。子进程通过套接字进行通信,最终关闭套接字并退出。

如果您单独查看子进程,您将看到发送,接收和最终关闭但没有初始连接,就像您描述的那样。

这是UNIX上更常见的模型,但有时在Windows上使用。

对于奇怪的重叠行为,如果你看一下非阻塞套接字的内部结构,你可能会看到这种情况。非阻塞套接字是在异步套接字上实现的,但我不知道细节。