WSARecv()可以立即返回数据吗?

时间:2015-02-24 11:26:11

标签: c++ sockets winapi network-programming iocp

调用WSARecv()时,是否有可能在不经过完成端口阶段的情况下立即返回数据。在WSARecv()文档中,它代表lpNumberOfBytesRecvd参数:

  

指向此调用接收的数据的数字(以字节为单位)的指针   接收操作立即完成。

2 个答案:

答案 0 :(得分:2)

当重叠的WSARecv()IO_PENDINGSUCCESS完成时,完成数据包排队等待IOCP,请参阅this MSDN article for details

使用Vista或更高版本,您可以通过调用套接字SetFileCompletionNotificationModes()并传递FILE_SKIP_COMPLETION_PORT_ON_SUCCESS来更改此信息(请注意,您可以在文档中将文件读作插槽,文件句柄的概念直接转换为插座)。

如果您启用完成端口跳过,那么当WSARecv()立即返回数据(即SUCCESS返回而不是IO_PENDING返回)时,您必须直接在{ {1}}呼叫网站,因为您将无法获得完成数据包。

请注意,启用"跳过完成端口"处理非常适合减少上下文切换,但您现在需要直接或在正常的完成处理程序中处理完成。

答案 1 :(得分:1)

是的,这并不罕见。请记住,数据到达IP数据包,其边界通常与您的读取不一致。如果您的WSARecv呼叫请求操作系统已经拥有的数据包中的数据,则无法延迟,Windows可能会立即将其返回。