一般如下:
connect();
select();
由于是非阻塞,很自然connect立即返回,而不同于阻塞条件下的成功或者失败才返回。
对于TCP来说,非阻塞的connect会立即返回一个错误EINPROGRESS,而且完成3路握手。
对于UDP来说,个人觉得,由于内核只是检查是否存在立即可知的错误,并记录对方的IP和端口号,没必要使用非阻塞的connect。
正常情况:
如果connect成功,select会发现套接字变得可写。出错的话套接字变得可写且可读。
极端情况:
connect于select之间并非原子操作,存在时间间隙。如果这个时候connect成功且收到一些数据的话,这个时候套接字由于有数据可读变得可读,又由于connect成功变得可写。
这样会导致本来connect成功,却误当做发生错误。
解决办法:
1.既然connect成功,那就用getpeername获取远端地址。如果出现ENOTCONN错误,则表示connect失败。 个人觉得这条方案不太好。
2.以值0调用read,如果read失败,那么connect失败,链接成功read返回0.
3.再调用一次connect一次,如果错误为EISCONN,那么套接口已经连接成功。