zoukankan      html  css  js  c++  java
  • 不应该使用Connected属性作为Socket是否连接上的依据

    最近在做一个接口,用到了Socket异步通信。

    调试了3天了,一直将Socket的Connected属性作为客户端和服务器端是否连接上的依据。今天发现我错了。

    下面是从一个csdn博友写的,很好。

    http://blog.csdn.net/xiaobai1593/article/details/7285930

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

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

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

    下面是在C#中测试客户端和服务端是否连接的方法:

    // .Connect throws an exception if unsuccessful
    client.Connect(anEndPoint);

    // This is how you can determine whether a socket is still connected.
    bool blockingState = client.Blocking;
    try
    {
    byte [] tmp = new byte[1];

    client.Blocking = false;
    client.Send(tmp, 0, 0);
    Console.WriteLine("Connected!");
    }
    catch (SocketException e)
    {
    // 10035 == WSAEWOULDBLOCK
    if (e.NativeErrorCode.Equals(10035))
    Console.WriteLine("Still Connected, but the Send would block");
    else
    {
    Console.WriteLine("Disconnected: error code {0}!", e.NativeErrorCode);
    }
    }
    finally
    {
    client.Blocking = blockingState;
    }

    Console.WriteLine("Connected: {0}", client.Connected);

    如果是进行单步调试,发现:只有在Connect()方法之后为True,然后在下一步执行时,就变为了False。控制台输出的为"false"

    如果是直接执行,则输出出来是"True"

    按说,在单步调试的时候,刚执行过Send()操作,应该挺“最近”的了,但在输出的时候还是"false";而直接执行的时候则没问题

    说明这个“最近”是很短暂的,调试的时候根本无法判断的!

    结论:

    Socket.Connected不能在调试时作为套接字是否连接的判断依据;而可以加入控制台输出语句来判断套接字的连接状况!
    ---------------------
    作者:caixiajia
    来源:CSDN
    原文:https://blog.csdn.net/caixiajia/article/details/53590157
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    【SpringCloud构建微服务系列】分布式链路跟踪Spring Cloud Sleuth
    【算法】LRU算法
    细说分布式锁
    【Python】Python3.4+Matplotlib详细安装教程
    LoRaWAN协议(二)--LoRaWAN MAC数据包格式
    LoRaWAN移植笔记(一)__RTC闹钟链表的实现
    cJSON_json包的C语言解析库
    LoRaWAN协议(一)--架构解析
    STM32L051 PVD的调试
    以帧为存储单位的循环stack
  • 原文地址:https://www.cnblogs.com/asdyzh/p/9945124.html
Copyright © 2011-2022 走看看