首页 > 编程语言 >C# socket tcp/ip 如何判断连接是否正常

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

时间:2024-01-16 13:45:07浏览次数:34  
标签:false socket C# ip client StartInfo true Socket

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

 // 检查一个Socket是否可连接
        private bool IsSocketConnected(Socket client)
        {
            bool blockingState = client.Blocking;
            try
            {
                byte[] tmp = new byte[1];
                client.Blocking = false;
                client.Send(tmp, 0, 0);
                return false;
            }
            catch (SocketException e)
            {
                // 产生 10035 == WSAEWOULDBLOCK 错误,说明被阻止了,但是还是连接的
                if (e.NativeErrorCode.Equals(10035))
                    return false;
                else
                    return true;
            }
            finally
            {
                client.Blocking = blockingState;    // 恢复状态
            }
        }

  

 

 

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的方法即可。

标签:false,socket,C#,ip,client,StartInfo,true,Socket
From: https://www.cnblogs.com/jtcr/p/17967479

相关文章

  • jmeter jdbc操作myql数据库及mysql驱动下载
     mysql驱动下载https://dev.mysql.com/downloads/connector/j/   1、先安装mysql的驱动mysql-connector-java-5.1.7-bin.jar配置jdbc的connectionconfigurationDatabaseUrl:jdbc:mysql://xxx.xxx.xxx.xxx:3306/test?allowMultiQueries=true&serverTimezone=UTC&c......
  • Kepware OPC UA Gateway之技术深度剖析与分享
    KepwareOPCUAGateway之技术深度剖析与分享随着客户对Kepware产品功能需求的进一步深入,Kepware适时推出了全功能套件(Premium Connectivity Suite)。使用一个授权即可解锁KepwareServer的所有功能,包含所有标准/高级驱动,IoTGateway,Datalogger,AdvancedTags等高级插件以及OPCU......
  • JMeter-JDBC,连接数据库增、删、改、查操作
     1、Callablestatement这是一个可调用语句类型,只要语法正确,任何语句,再多的条数都能支持,所以查询或者插入数据,进行多个sql语句操作,那么就要选择Callablestatement。插入多条sql语句,则要现在Callablestatement。  上面是插入单条数据,使用不方便,下面就行参数化1.加一......
  • 深入了解 ReadDirectoryChangesW 并应用其监控文件目录
    简介监视指定目录的更改,并将有关更改的信息打印到控制台,该功能的实现不仅可以在内核层,在应用层同样可以。程序中使用ReadDirectoryChangesW函数来监视目录中的更改,并使用FILE_NOTIFY_INFORMATION结构来获取有关更改的信息。ReadDirectoryChangesW是Windows提供一个函数......
  • Docker 与 Linux Cgroups:资源隔离的魔法之旅
    这篇文章主要介绍了Docker如何利用Linux的ControlGroups(cgroups)实现容器的资源隔离和管理。最后通过简单Demo演示了如何使用Go和cgroups交互。如果你对云原生技术充满好奇,想要深入了解更多相关的文章和资讯,欢迎关注微信公众号。搜索公众号【探索云原生】即可订阅......
  • C#中的迭代器
    枚举器和迭代器使用foreach语句迭代遍历int[]arr={9,12,43,10,6,5};foreach(inteinarr)Console.WriteLine(e);数组之所以这么可以做,原因是数组可以按需提供一个叫做枚举器的对象,枚举器可以依次返回请求数组中的元素。对于有枚举器的类型而言,必须有一种方式来获......
  • 无涯教程-SQL - Truncate(清空表)
    SQLTRUNCATETABLE命令用于从现有表中删除完整数据。Truncate-语法TRUNCATETABLE命令的基本语法如下。TRUNCATETABLEtable_name;Truncate-示例考虑具有以下记录的CUSTOMERS表-+----+----------+-----+-----------+----------+|ID|NAME|AGE|ADDRES......
  • Road Extraction from Remote Sensing Images Using the Inner Convolution Integrate
    landbench里面,李老师提到的encode-decode。remotesensing,大类是2区,小类是2到3区。分类的题目:“利用内部卷积集成编码器-解码器网络和定向条件随机场从遥感图像中提取道路”(pdf)“RoadExtractionfromRemoteSensingImagesUsingtheInnerConvolutio......
  • 【pwn】wustctf2020_closed --exec重定向
    这道题先来看一下ida这道题的代码逻辑很简单,首先关闭了标准输出和错误输出那可以将标准输出重定向到标准输入exec1>&0是一种Shell命令行中的重定向语法,用于将标准输出(文件描述符1)重定向到标准输入(文件描述符0)。在LinuxShell中,每个进程都有三个默认的标准文件描述符:标准......
  • docker 设置 ulimit
    一、通过dockerrun–ulimit参数设置这个容器的ulimit值dockerrun--ulimitnofile=1024:1024--rmdebiansh-c"ulimit-n"二、通过配置daemon.json配置默认值配置nofile{"default-ulimits":{"nofile":{......