对于非阻塞connect的一点认识

来源:互联网 发布:淘宝回收电话卡 编辑:程序博客网 时间:2024/04/19 13:59

一般如下:

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,那么套接口已经连接成功。

原创粉丝点击