文章目录
  1. 非阻塞connect
  2. 聊天室
    1. 客户端
    2. 服务器
  3. 同时处理TCP与UDP服务

非阻塞connect

connect出错时会出现的一种errno值:EINPROGRESS;这种错误发生在对非阻塞的socket调用connect,而连接又没有立即建立时。

此时,网络程序可以调用select、poll函数来监听这个连接失败的socket上的可写事件。当I/O复用函数返回后,再利用getsockopt来读取并清除该socket的错误;若错误的值为0,表示连接成功;否则,连接失败。

聊天室

一些网络服务如ssh需要同时处理网络连接与用户输入,这可以使用I/O复用来实现。

对于聊天室服务,由两部分组成:客户端与服务器;客户端负责:(1)从标准输入终端读入用户数据,并将用户数据发送到服务器;(2)将服务器发送过来的数据打印到标准输出终端;服务器则负责接收用户数据,并将该数据发送给除数据发送者之外的所有在线客户端。

客户端

客户端使用poll同时监听用户输入与网络连接,并利用splice函数将用户输入内容直接定向到网络连接然后将其发送(数据零拷贝,提高程序执行效率)。

服务器

服务器使用poll同时管理监听socket与连接socket。

计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决

同时处理TCP与UDP服务

创建一个流socket(TCP服务)与数据包socket(UDP服务),均绑定到某一端口。使用I/O复用技术,就能同时监听该端口的TCP服务与UDP服务。