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

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

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

看来我们错误地认为,如果填充发送缓冲区(CreateNamedPipe中的nInBufferSize),将会触发asynchronous完成,相反,它似乎更具侵略性,与发送缓冲区的大小无关。 对于套接字和命名pipe道,如果速度足够快,则在第二次写入时,一个大的发送缓冲区(100k +)和小消息(几个字节)将始终asynchronous完成。

任何人都可以确认吗? 有没有人有启发式信息,Windows实施在决定何时asynchronous完成I / O操作,而不是同步完成?

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

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

你必须编写正确的代码来处理一个成功的“同步”发送或待处理的“异步”发送,这样做有多大的区别是你经常得到哪种结果呢?

另外,除非使用SetFileCompletionNotificationModes()来启用FILE_SKIP_COMPLETION_PORT_ON_SUCCESS ,否则同一代码路径将用于同步和未决结果。