【问题标题】:How does Overlapped I/O relates to the concept of blocking and non-blocking sockets?重叠 I/O 与阻塞和非阻塞套接字的概念有何关系?
【发布时间】:2015-02-23 15:10:02
【问题描述】:

我想知道使用重叠 I/O 是否意味着我在非阻塞模式下使用套接字,或者阻塞和非阻塞套接字的概念与重叠 I/O 的概念无关。

【问题讨论】:

  • 使用重叠 I/O,您不必直接与套接字进行太多交互。您将 I/O 请求和缓冲区排队到内核/堆栈并等待完成通知。它有点像 select/epoll,但不需要从用户状态调用 send/recv - 缓冲区发送/加载可以在内核状态内处理。

标签: c++ windows sockets network-programming overlapped-io


【解决方案1】:

我会说它们彼此没有关系。套接字的阻塞与非阻塞是直截了当的。如果您在非阻塞模式下调用 send()recv() 并且套接字没有任何可用的内容(send() 没有出站缓冲区空间,recv() 没有入站数据),您会收到错误响应的WSAWOULDBLOCK。如果处于阻塞模式,该函数将在请求的操作完成或发生错误之前不会返回。

但是,I/O 重叠更像是一种委托模式。它将接受您的WSASend()WSARecv() 请求并为您处理。但是,这不会在函数返回后立即发生。相反,这些函数接收指向客户端指定的回调的指针。一旦发送/接收操作完成,您将通过您提供的回调方法收到通知。

我会说 I/O 重叠是为了消除客户端程序员不断检查非阻塞套接字并调用 select() 来轮询它们的需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 2016-09-16
    • 2010-10-31
    • 2013-10-15
    相关资源
    最近更新 更多