最新消息:南山南 北秋悲

linux网络编程之I/O复用

linux darksea 680浏览 0评论

上一篇linux网络编程之TCP通信的文章linux网络编程之TCP通信中列举了一个简单的回射客户/服务器例子。

这个例子里的TCP客户端要同时处理两个输入:标准输入stdin和TCP套接口sock_fd。

这里有一个问题:

如果客户阻塞于(标注输入stdin)的fgets调用期间,服务器进程被杀死。这个时候服务器TCP虽然正确的给客户TCP发送了一个FIN,但客户进程此时正阻塞于从stdin读取数据,客户TCP将看不到这个EOF,要直到从套接口读时才看到,这很可能过去了很长时间。

这个问题可以用I/O复用来解决,I/O复用可以使内核一旦发现进程指定的一个或多个I/O条件就绪,就通知进程。

I/O复用典型使用在下列网络应用场合:

  • 客户处理多个描述字或套接口
  • 服务器既要处理TCP又要出来UDP
  • 一个服务要处理多个服务或多个协议

这个简单的回射客户/服务器例子属于第一种情况,下面看看具体怎么使用。

select函数原型:

select函数会在这些情况下返回:

  • readfds集合中有描述符处于可读
  • 或者writefds集合中有描述符处于可写
  • 或者errorfds集合中有描述符遇到错误情况
  • 如果这三种情况都没有发生,select将在timeval指定的时间后超时返回,timeval为空时永远等待,为0时不等待。

nfds指定测试的描述字个数。

使用select I/O复用替换先前的客户端代码:

结果:当杀死服务器端进程,不会阻塞于标准输入,而是当socket满足可读状态时,立刻读socket

[root@localhost Debug]# ./timeClientSelect 127.0.0.1
服务器断开连接

 

转载请注明:小菜C不是菜 » linux网络编程之I/O复用

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址