Socket.Connected 不能作为TCP连接的判断依据

本文详细解析了.NET中Socket.Connected属性的含义,指出其并不能准确反映实时连接状态。文章引用微软帮助文档,解释了Socket在TCP通信时可能存在的误导,并提供了一种通过发送零字节非阻塞Send调用来检测连接状态的方法。这种方法在遇到网络中断时能更准确地判断套接字是否仍处于连接状态。
摘要由CSDN通过智能技术生成

TCP正常通信时Socket.Connected的值为false。
参考微软的帮助说明:
http://technet.microsoft.com/zh-cn/magazine/system.net.sockets.socket.connected(VS.90).aspx
Socket..::.Connected 属性
获取一个值,该值指示 Socket 是在上次 Send 还是 Receive 操作时连接到远程主机。

Connected 属性获取截止到最后的 I/O 操作时 Socket 的连接状态。当它返回 false 时,表明 Socket 要么从未连接,要么已断开连接。

Connected 属性的值反映最近操作时的连接状态。如果您需要确定连接的当前状态,请进行非阻止、零字节的 Send 调用。如果该调用成功返回或引发 WAEWOULDBLOCK 错误代码 (10035),则该套接字仍然处于连接状态;否则,该套接字不再处于连接状态。

如果调用用户数据报协议 (UDP) 套接字上的 Connect,则 Connected 属性始终返回 true;不过,此操作不更改 UDP 的内在无连接特性。

Connected是过去式哈,是指上一次收发是否完成,不是表示将来你收发是否能成功。

进行非阻止、零字节的 Send 调用。如果该调用成功返回或引发 WAEWOULDBLOCK 错误代码 (10035),则该套接字仍然处于连接状态;否则,该套接字不再处于连接状态。
socket.Connected 此属性在断网时并不会精确判断连接状态,可以通过发包测试连接状态.代码如下:
// 通过发包检测socket连接是否存在 
 

private bool IsSocketConnected() 
{ 
    bool connectState = false; 
    bool blockingState = socket.Blocking; 
    try
    { 
        byte[] temp = new byte[1]; 
        socket.Blocking = false; socket.Send(temp, 1, 0); 
        connectState = true; 
    } 
    catch (SocketException e) 
    { 
        // 产生 10035 == WSAEWOULDBLOCK 错误,说明被阻止了,但是还是连接的 
        if (e.NativeErrorCode.Equals(10035)) 
        { 
        connectState = true; 
        } 
    } 
    finally 
    { 
        socket.Blocking = blockingState;
    } 
    return connectState; 
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值