2014-11-03 35 views
1

我们编写了利用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

+3

此类实现细节可能会有所变化。你需要确保你的代码不包含任何关于它们的假设。 – 2014-11-03 02:49:37

回答

1

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

您必须编写正确的代码来处理成功的“同步”发送或待处理的“异步”发送,那么它会使您得到哪种结果的频率有多大?

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