异步连接过程:
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