gpt4 book ai didi

windows - IOCP : how does the kernel decide to complete WSASend synchronously or asynchronously?

转载 作者:行者123 更新时间:2023-12-03 12:00:25 25 4
gpt4 key购买 nike

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

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

似乎我们错误地认为,如果我们填充发送缓冲区(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

最佳答案

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

您必须编写正确的代码来处理成功的“同步”发送或未决的“异步”发送,因此,这两种结果出现频率有何不同?

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

关于windows - IOCP : how does the kernel decide to complete WSASend synchronously or asynchronously?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26707050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com