非阻塞套接字与重叠I/O技术

3

我正在尝试理解socket编程中的非阻塞套接字和重叠I/O,但只有三本书提到这个概念,却没有详细解释或给出任何示例。

所以我需要一篇文章来解释这个概念并附带一个示例,或者直接给我一个示例让我自己实践。最好是针对Windows系统的,但我想我也可以从Unix系统中转换过来。

我不介意以书籍作为参考,但我很高兴避免再花费50美元。到目前为止,我只找到了基本概念和与其他socket模型的基本比较。虽然我理解它们的概念,但我希望看到它们的实际应用,并可能得到一个关于它们如何工作的好的解释。(我不介意长篇大论的文章:)


我的第一个想法是要理解重叠I/O。它有非常具体的含义:http://en.wikipedia.org/wiki/Overlapped_I/O 请阅读那篇文章。 - Tony The Lion
1
任何关于C++套接字的跨平台分析都必须至少简要地涉及Boost.Asio(在我看来!)http://www.boost.org/doc/libs/1_51_0/doc/html/boost_asio.html - Nick
2
另一篇不错的文章,解释了为什么它被称为“重叠”I/O,可以参考这篇文章:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686358(v=vs.85).aspx - Tony The Lion
@Nick:据我所知,重叠I/O是Windows特有的东西。 - Tony The Lion
没错,我只是Boost.Asio的狂热支持者! :) 为什么要费力学习所有关于Overlapped I/O的知识,当你可以使用ASIO拥有如此优雅的实现呢。 - Nick
显示剩余3条评论
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完成端口那样具有可扩展性,但请先熟悉前者。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接