异步连接过程:
1. socket
2. set non-block
3. ret = connect
4. if ret == 0
register to Reactor
5. else
connected failed
6. ConnectHandler中:
Reactor接收到writable事件,会回调WriteHandler
但是,如果远程服务端口,根本没有起来时,Reactor还是会Writable
所以还需要其他机制判断是否真的Connected
因此: 异步Connect时,settting non-block后,判断是否可写,来断定是否连接上!这种说法是不对的。
解决方案:
在上述 第 4步前:
调用Socket.getsocketopt(socket.SOL_SOCKET, socket.SO_ERROR, &ret)
如果 ret ==0 ->说明连接建立,否则 可以打印ret 和os.strerror(ret)看看错误代码
但是, 这个方案在跨平台方面需要注意一下:
在Linux下,getsocketopt的返回值是 errno.EINPROGRESS 115
在Windows下,getsocketopt的返回值居然是 10035, Windows TCP Error Codes显示:WSAEWOULDBLOCK -- Resource temporarily unavailable.
代码上需要调整一下:
4. ret = getsocketopt()
if( ret == 0 or ret == errno.EINPROGRESS or ret == 10035)
#或者根据操作系统判断返回值
register to Reactor
else:
connect error!
#end if
异步TCP连接:如何判断成功
异步TCP连接过程中,设置非阻塞后,直接根据连接返回值判断是否可写来确认连接成功并不准确。正确做法是在尝试连接前,通过getsockopt获取SOCKET错误码。在Linux下,错误码可能是errno.EINPROGRESS(115),而在Windows下可能是10035。根据返回值适配不同平台进行连接状态判断。
1万+

被折叠的 条评论
为什么被折叠?



