有限时间完成connect

阻塞方式

  1. alarm,判断返回值是否是EINPROGRESS
  2. select (timeout) 检查返回值是否为1
  3. select + alarm 检查返回值是否为1

非阻塞方式

背景知识:
当connect为非阻塞时,调用connect后错误码返回EINPROGRESS.
调用Select时,当connect连接完成时,其套接字是可写的,当连接遇到错误时,描述符既可读又可写,需要调用getsockopt获取套接字待处理的错误(用SO_ERROR套接字选项),如果连接成功建立,则返回0;如果连接错误,会得到一个对应的连接错误的errno值。

取代getsockopt的方法

  1. 调动getpeername代替getsockopt。如果getpeername以ENOTCONN错误返回,则建立连接失败
  2. 调用read(0)。如果建立连接失败,那么返回相应的错误值;如果建立连接成功则返回0.
  3. 再次调用connect。如果错误是EISCONN,那么套接字已连接。

注:
若阻塞状态下connect失败,则connect不可重复调用。
若在阻塞状态下被中断了,则只能调用Select,执行上面非阻塞的相关操作来判断套接字是否连接成功。

你可能感兴趣的:(有限时间完成connect)