C#中Tcp断线重连的两种方法

方法一

cs 复制代码
 Socket client;
 Task.Run(async () =>
    {
        try
        {
            int index = 0;
            while (true)
            {
                index++;
                await Task.Delay(1000);
                client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                var result = client.BeginConnect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6666), null, null);
                bool state = result.AsyncWaitHandle.WaitOne(1000);// 为什么   卡   20秒
                                                                  // state : 异步动作在1秒时间内完成  
                if (client.Connected)
                {
                    client.EndConnect(result);// EndConnect不代表断开连接  ,结束这个异步对象
                    Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss")}-{DateTime.Now.Millisecond.ToString("000")}  [{index.ToString("000")}]  连接成功");
                }
                else
                {
                    // 连接销毁  
                    Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss")}-{DateTime.Now.Millisecond.ToString("000")}  [{index.ToString("000")}]  连接失败");
                }
                client.Dispose();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    });

方法二

cs 复制代码
  // 拿到最新的状态 
  Socket socket = new Socket(
      AddressFamily.InterNetwork,
      SocketType.Stream,
      ProtocolType.Tcp);

  // 三次握手
  socket.Connect(new IPEndPoint(IPAddress.Parse("192.168.2.1"), 102));
  // 物理线路的断开
  // 上位机应用 -------------> PLC
  // 上位机应用 --------路由器/交换机 -----(断连)---->  PLC
  //     第二种情况解决方案:心跳    请求 I0.0(不同的PLC不同处理)->响应false
  //                 Send  ->  Receive(超时处理)  超时N次时  判断失联
  //                 单独线程  10秒钟执行一次
  Console.WriteLine(socket.Connected);// 保留最后一次操作时的状态,不是实时的状态 

  while (true)
  {
      // 心跳请求
      Thread.Sleep(1000);
      bool state = !(!socket.Connected || (socket.Poll(1, SelectMode.SelectRead) && socket.Poll(1, SelectMode.SelectWrite) && (socket.Available == 0)));// 返回True   :连接正常
      if (state)
      {
          Console.WriteLine("连接正常");
          socket.Shutdown(SocketShutdown.Both);
          socket.Dispose();
      }
      else
      {
          Console.WriteLine("连接断开");
          socket = new Socket(
                 AddressFamily.InterNetwork,
                 SocketType.Stream,
                 ProtocolType.Tcp);
          try
          {
              // 大概20秒时间
              socket.Connect(new IPEndPoint(IPAddress.Parse("192.168.2.1"), 102));
          }
          catch (Exception ex)
          {
              Console.WriteLine("重新连接失败");
              Console.WriteLine(ex.Message);
          }
          var result = socket.BeginConnect(new IPEndPoint(IPAddress.Parse("192.168.2.1"), 102), new AsyncCallback(r =>
          {
              // 
              Console.WriteLine(r.AsyncState);
              if (!r.IsCompleted)   // 连接请求的动作 执行完成    不包括连接状态
                  socket.EndConnect(r);
              Console.WriteLine("回调执行");
          }), null);
          bool s = result.AsyncWaitHandle.WaitOne(1000);
          if (s)// 连接成功后
          {
              Console.WriteLine("重新连接");
          }
          else
          {
              // 连接的时候  异步,在1秒钟时间内   没有连接成功   跳出
              try
              {
                  socket.EndConnect(result); // 销毁之前的连接请求    卡线程
              }
              catch (Exception ex)
              {
                  Console.WriteLine(ex.Message);
              }
              Console.WriteLine("重连失败");
          }
      }
      //重连  使用    发送业务请求  执行连接判断    
相关推荐
奇树谦1 小时前
HDD 为什么适合顺序大文件读写:从 RAID 5 到 RAID 50 的原理与性能分析
linux·运维·网络
嵌入式阿蔡2 小时前
Linux_01:交叉编译与开发环境实战——从单片机跨到 Linux 的第一道坎
linux·运维·网络·单片机·嵌入式硬件·嵌入式实时数据库
雷电小将军3 小时前
诡秘之主手游占卜家序列加点 诡秘之主手游占卜家怎么加点
服务器·网络·游戏·电脑·玩游戏
陈皮波比茶3 小时前
Python项目实战-网络机器人(爬虫)
开发语言·网络·爬虫·python·机器人
白猫不黑3 小时前
网络安全/信息安全专业学习路线与入行指南:从大学到岗位的完整规划
网络·学习·安全·web安全·网络安全·黑客技术
wWYy.3 小时前
Linux发送数据包的过程
linux·网络
云飞云共享云桌面3 小时前
自动化设备厂 10 人研发团队,如何共用一台服务器做 SolidWorks 建模?
运维·服务器·网络·3d·自动化·制造
小谢取证4 小时前
实战案例分享:用 AI 绕过模拟器反取证进行动态抓包,落地 APK 真实 IP
大数据·网络·人工智能
xqwxbl4 小时前
小微企业差旅出行不用愁2026年头部商旅平台怎么选?看这篇就够了
大数据·网络·人工智能
QH139292318804 小时前
NVIDIA H200 H300服务器
运维·服务器·开发语言·网络·信息与通信