Linux网络编程之socket编程(十一)-超时设置

下面接着学习套接字I/O超时设置方法以及用select实现超时——read_timeout函数封装、write_timeout函数封装、accept_timeout函数封装、connect_timeout函数封装。

1.套接字I/O超时设置方法
  • alarm
  • 套接字选项:SO_SNDTIMEO、SO_RCVTIMEO
  • select

(1)alarm

1)比如有一个read读动作,在读之前先设置一个闹钟。如果超时,就会产生SIGALRM信号,将read函数打断。
2)被打断,意味超时,将errno错误码置为ETIMEDOUT
3)否则如果读到数据,就将闹钟关闭。
4)但是闹钟容易产生冲突,所以一般不会采用这种方案

(2)套接字选项

  • SO_SNDTIMEO:表示发送超时时间
  • SO_RCVTIMEO:表示接收超时时间

1)调用setsockopt,再去读取数据的时候。如果超时时间到了,那么ret返回值-1并且错误码为EWOULDBLOCK。然后将错误码置为WTIMEDOUT
2)这种方案也能控制超时,一般以很少采用该方案。

(3)用select实现时超

  • read_timeout函数封装
  • write_timeout函数封装
  • accept_timeout函数封装
  • connect_timeout函数封装

1)read_timeout

2)write_timeout

3)accept_timeout

4)connect_timeout

这个函数较其他三个要复杂一些:

a)首先我们不能直接connect,因为一旦调用connect就意味着阻塞了。
b)这时候我们希望以非阻塞的形式调用它,意味着我们需要将套接口fd设置为非阻塞模式。对此,我们封装了一个函数activate_nonblock。
c)接下来就可以调用connect了。

小结:
介绍了套接字I/O超时设置的3中方法,其中用select实现的超时函数较为重要。

发表评论

电子邮件地址不会被公开。 必填项已用*标注