调用WSARecv()
时,是否有可能在不经过完成端口阶段的情况下立即返回数据。在WSARecv()
文档中,它代表lpNumberOfBytesRecvd
参数:
指向此调用接收的数据的数字(以字节为单位)的指针 接收操作立即完成。
答案 0 :(得分:2)
当重叠的WSARecv()
与IO_PENDING
或SUCCESS
完成时,完成数据包排队等待IOCP,请参阅this MSDN article for details。
使用Vista或更高版本,您可以通过调用套接字SetFileCompletionNotificationModes()
并传递FILE_SKIP_COMPLETION_PORT_ON_SUCCESS
来更改此信息(请注意,您可以在文档中将文件读作插槽,文件句柄的概念直接转换为插座)。
如果您启用完成端口跳过,那么当WSARecv()
立即返回数据(即SUCCESS
返回而不是IO_PENDING
返回)时,您必须直接在{ {1}}呼叫网站,因为您将无法获得完成数据包。
请注意,启用"跳过完成端口"处理非常适合减少上下文切换,但您现在需要直接或在正常的完成处理程序中处理完成。
答案 1 :(得分:1)
是的,这并不罕见。请记住,数据到达IP数据包,其边界通常与您的读取不一致。如果您的WSARecv
呼叫请求操作系统已经拥有的数据包中的数据,则无法延迟,Windows可能会立即将其返回。