C# socket tcp/ip 如何判断连接是否正常

判断socket是否断开连接,网上有N种说法:
1.Socket.Connected
这个属性只能说明上一次通信时还是正常的。 比如说你拔掉网线后就它显示还是为true。用这个方法最好和ping一起组合使用。ping的方法如下

        public bool PingOC(String ips)
        {
            bool ret;
            Process p = new Process();
            p.StartInfo.FileName = "cmd.exe";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
            int i = 0;
            p.Start();
            p.StandardInput.WriteLine("ping -n 1 " + ips);
            p.StandardInput.WriteLine("exit");
            string strRst = p.StandardOutput.ReadToEnd();
            if (strRst.IndexOf("(100%") == -1)
            {
                ret = true;
            }
            else
            {
                ret = false;
            }
            p.Close();
            return ret;
        }

2.Socket.Pool

这个方法是可以,但是它要从socket里读或写部分数据,如果其他线程从这个socket读写数据,那么数据将会出错。我在写一个远程通信软件时候就出现这个问题了。
而且http://technet.microsoft.com/zh-cn/system.net.sockets.socket.poll.aspx上这样说的:
此方法不能检测某些类型的连接问题,例如,网络电缆中断或远程主机意外关闭。您必须尝试发送或接收数据以检测这些类型的错误。

3.使用心跳包
每隔一段时间,socket一方向另一方发送一段特殊的数据,socket的另一方接到这个数据后回发回来。这样就能判断socket两方都没有掉线了。

4.

判断Socket是否连接上,需要通过发包来确认: (这个方法也不能解决物理掉线问题,比如拔网线)

 

 1         // 检查一个Socket是否可连接
 2         private bool IsSocketConnected(Socket client)
 3         {
 4             bool blockingState = client.Blocking;
 5             try
 6             {
 7                 byte[] tmp = new byte[1];
 8                 client.Blocking = false;
 9                 client.Send(tmp, 0, 0);
10                 return false;
11             }
12             catch (SocketException e)
13             {
14                 // 产生 10035 == WSAEWOULDBLOCK 错误,说明被阻止了,但是还是连接的
15                 if (e.NativeErrorCode.Equals(10035))
16                     return false;
17                 else
18                     return true;
19             }
20             finally
21             {
22                 client.Blocking = blockingState;    // 恢复状态
23             }
24         }

5.利用keepalive检测。

具体代码方法见:https://www.cnblogs.com/wzd24/archive/2007/05/22/755050.html       https://www.cnblogs.com/legendtao/p/4930098.html

手动设置注册表的方法:https://blog.csdn.net/chenjianqi0502/article/details/78490295 。

具体工作中大家根据实际情况选择合适方法。我一般选择第一种+ping的方法即可。

 

 

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@榴莲酥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值