3

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

所以我要找的是一篇文章,其中用一个例子来解释这个get,或者只是一个我可以自己完成的例子。如果这适用于 Windows,那就太好了,但我想我也应该能够从 unix 传输它。

我不介意一本书作为资料来源,但我很乐意避免再花 50 美元。到目前为止,我只找到了非常基本的概念以及与其他插座模型的基本比较。并不是我不理解他们的概念,而是我希望看到他们在行动中,也许能很好地解释他们是如何工作的。(我根本不介意长篇文章:))

4

1 回答 1

2

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

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

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

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

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

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

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

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

于 2012-09-18T12:08:49.843 回答