[网络通信]socket编程中检查connect是否成功

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、编程中的connect成功判定

1、非阻塞socket在connect时返回EWOULDBLOCK,说明后台在异步处理中。

2、用select检查socket是否可写,当select返回,并且FD_ISSET为真时,可能存在两种情况,一种的确是连接成功,另外一种是已经失败了,可能是被reset或timeout,此时需要判断是否下真的成功。可以用的办法有:

    I、再次调用connect。(windows下在一个成功连接的socket上再次connect会返回-1,WSAGetLastError()为WSAEISCONN,在Linux下会返回0)

    II、对socket调用read,读取长度为0的数据,应返回0,表示成功。

    III、getpeername获取对端socket地址,如果返回ENOTCONN,表示失败。

    IV、用SO_SOCKET调用getsockopt得到socket上的待处理错误,不为0表示失败。

3、windows下connect失败由except set中提示,只检查可写,因此select会一直等到select中设定的时间到达,虽然实际是已经收到了RESET。所以在windows可以考虑用WSAPoll。

 

 

    

转载于:https://my.oschina.net/u/136074/blog/719555

你可能感兴趣的:([网络通信]socket编程中检查connect是否成功)