代码之家  ›  专栏  ›  技术社区  ›  user4592590

WSARecv()能否立即返回数据?

  •  1
  • user4592590  · 技术社区  · 9 年前

    呼叫时 WSARecv() ,是否可以在不经过完成端口阶段的情况下立即返回数据。在 WSARecv() 文档,上面写着 lpNumberOfBytesRecvd 参数:

    指向此调用所接收数据的字节数的指针,如果 接收操作立即完成。

    2 回复  |  直到 9 年前
        1
  •  3
  •   Len Holgate    9 年前

    WSARecv() 以完成 IO_PENDING SUCCESS 完成数据包被排队到IOCP,请参见 this MSDN article for details .

    对于Vista或更高版本,您可以通过调用 SetFileCompletionNotificationModes() 用于套接字和传递 FILE_SKIP_COMPLETION_PORT_ON_SUCCESS (注意,您可以在文档中将文件读为套接字,文件句柄的概念直接转换为套接字)。

    如果确实启用完成端口跳过,则当 WSARecv() 立即返回数据(即 成功,成功 返回而不是 IO_结束 return),那么您必须直接在 WSARecv() 呼叫站点,因为您将不会收到完成包。

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

        2
  •  1
  •   MSalters    9 年前

    是的,这并不罕见。请记住,数据以IP数据包的形式到达,其边界通常与您的读取不一致。如果您的 WSARecv 调用从OS已经保存的数据包中请求数据,没有必要延迟,Windows可能会立即返回。