異步連接配接過程:
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