c++ - 具有重叠 I/O 的非阻塞套接字

标签 c++ sockets nonblocking overlapped-io

我正试图在套接字丛林中工作,并遇到了具有重叠 I/O 的非阻塞套接字。我家里有三本书只提到了这个概念,但没有真正解释它或给我任何例子。

所以我要找的是一篇文章,其中用示例解释了这个问题,或者只是一个我可以自己完成的示例。如果这适用于 windows 就好了,但我想我也应该能够从 unix 转移它。

我不介意将书籍作为来源,但我很乐意避免再支付 50 美元。到目前为止,我只找到了非常基本的概念和与其他 socket 模型的基本比较。这并不是说我不理解他们的概念,而是我希望看到他们的实际行动,并且可能对他们的工作原理有一个很好的解释。 (我根本不介意长篇文章:))

最佳答案

短语“非阻塞套接字”通常是指使用 FIONBIO 套接字选项,即使没有数据准备好读取,它也会立即返回对 read() 的调用。 (它返回一个 EWOULDBLOCK 错误。)

重叠 I/O 是 Windows API 特有的东西(例如在 UNIX 上不可用)。 使用 FIONBIO 套接字选项,也未使用传统的 Berkeley 套接字 API 函数调用(read() 等)。

(对于 Linux 上的 POSIX 等效项,请参阅“man aio”或在​​您最喜欢的搜索引擎中键入 man aio。)

既然您已经了解“非阻塞套接字”和“重叠 I/O”是两种不同的方法(不能混用),找到关于每种方法的有用文章应该会容易得多。

关于重叠 I/O 的 MSDN 文档实际上非常好。如果您正在进行 Windows 编程,那么您确实需要在性能和可伸缩性很重要的任何地方使用重叠 I/O。这是一个很好的起点:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365603%28v=vs.85%29.aspx

(这篇 MSDN 文章是关于管道的,但是使用套接字是完全一样的。)

另外,请注意 WaitForMultipleObjects() 的扩展性不如使用 I/O 完成端口,但请先适应前者。

关于c++ - 具有重叠 I/O 的非阻塞套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12474521/

相关文章:

c++ - 从 ATL ActiveX 控件返回对象数组

java - 在UDP Socket Java Android上发送多个数据

python - 后台Twisted服务器的模式,该服务器填充了传入消息队列并清空了传出消息队列?

c++ - 32位和64位可以一起工作吗?

c++ - 如何在 WinDbg 执行期间打印每个函数调用?

c++ - 将 QString 转换为 const char* 时不可预测的运行时行为

c - 套接字连接失败,telnet OK

c++ - 如何在linux C中取消阻止recv()或recvfrm()函数

java - 在 Play Controller-Action 中通过 #flatMap() 链接 Promise

java - 在 Ldap 搜索上设置方法超时