现在的位置: 首页 > 综合 > 正文

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

2013年08月14日 ⁄ 综合 ⁄ 共 771字 ⁄ 字号 评论关闭

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

 

抱歉!评论已关闭.