天天看点

异步连接时,判断是否连接成功

异步连接过程:

 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

继续阅读