阻塞方式
- alarm,判断返回值是否是EINPROGRESS
- select (timeout) 检查返回值是否为1
- select + alarm 检查返回值是否为1
非阻塞方式
背景知识:
当connect为非阻塞时,调用connect后错误码返回EINPROGRESS.
调用Select时,当connect连接完成时,其套接字是可写的,当连接遇到错误时,描述符既可读又可写,需要调用getsockopt获取套接字待处理的错误(用SO_ERROR套接字选项),如果连接成功建立,则返回0;如果连接错误,会得到一个对应的连接错误的errno值。
取代getsockopt的方法
- 调动getpeername代替getsockopt。如果getpeername以ENOTCONN错误返回,则建立连接失败
- 调用read(0)。如果建立连接失败,那么返回相应的错误值;如果建立连接成功则返回0.
- 再次调用connect。如果错误是EISCONN,那么套接字已连接。
注:
若阻塞状态下connect失败,则connect不可重复调用。
若在阻塞状态下被中断了,则只能调用Select,执行上面非阻塞的相关操作来判断套接字是否连接成功。