天天看點

異步連接配接時,判斷是否連接配接成功

異步連接配接過程:

 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

繼續閱讀