有限时间完成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,执行上面非阻塞的相关操作来判断套接字是否连接成功。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容