我们编写了利用I/O完成端口的软件,并在SOCKET对象上使用WSASend,在命名管道上使用WriteFile。IOCP:内核如何决定同步或异步完成WSASend?
在这两种情况下,我们发现这些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
此类实现细节可能会有所变化。你需要确保你的代码不包含任何关于它们的假设。 – 2014-11-03 02:49:37