IOCP:内核如何决定同步或异步完成WSASend?

时间:2014-11-03 02:44:29

标签: windows sockets winapi asynchronous

我们编写了利用I / O完成端口的软件,并在SOCKET对象上使用WSASend,在命名管道上使用WriteFile。

在这两种情况下,我们发现那些API比我们预期的更快地返回SOCKET_ERROR / WAS_IO_PENDING [1](或者命名管道WriteFile操作的等价物)。

似乎我们错误地认为如果我们填满发送缓冲区(CreateNamedPipe中的nInBufferSize)会触发异步完成,相反它似乎更加激进并且与发送缓冲区的大小无关。对于套接字和命名管道,如果足够快,则在第二次写入时将始终异步完成大型发送缓冲区(100k +)和小消息(几个字节)。

任何人都可以证实吗?有没有人知道Windows实现在决定何时异步完成I / O操作时所遵循的启发式方法,而不是同步完成?

[1]"如果重叠操作成功启动并稍后完成,则WSASend返回SOCKET_ERROR并指示错误代码WSA_IO_PENDING。" - http://msdn.microsoft.com/en-us/library/windows/desktop/ms742203(v=vs.85).aspx

1 个答案:

答案 0 :(得分:1)

为什么你认为你需要知道或关心。它不是API的文档部分,它可能会受到当时堆栈中驱动程序和任何分层服务提供程序的影响。

您必须编写正确的代码才能处理成功的'同步'发送或待处理的异步'发送,那么你得到这种结果的频率有多大差异?

另外,除非您使用SetFileCompletionNotificationModes()启用FILE_SKIP_COMPLETION_PORT_ON_SUCCESS,否则同步和待处理结果都会使用相同的代码路径。