c# Socket心跳试验,自定义发送包 和 使用KeepAlive

摘要:
我记录了我心跳的位置,但WireShark无法检测到正在发送的消息,主要是因为发送的数据大小为0。如果网络电缆被拔掉,下次检测到心跳时就会报告错误。虽然这种方法可以检测套接字是否断开,但它不是很好,响应也不及时。当使用KeepAlive时,WireShark通常会检测到它不停地向Socket服务器发送消息,即心跳检测。图:通过三次握手(前三次握手)建立连接后,每三秒执行一次心跳检测,这与我在代码中设置的一致。注意,Time列从16开始执行10次。这是win10系统的默认设置。
事前准备

下载Wireshark并安装

打开Wireshark,修改过滤规则:ip.src eq 192.168.3.201 or ip.dst eq 192.168.3.201  如图:

c# Socket心跳试验,自定义发送包 和 使用KeepAlive第1张

不使用KeepAlive

网上有段代码,可以对socket进行心跳检测,下面贴出部分代码:

            bool blockingState = socket.Blocking;
            try
            {
                byte[] tmp = new byte[1];
                socket.Blocking = false;
                socket.Send(tmp, 0, 0);
                return true;
            }

Socket.Send方法的第二个参数表示发送数据的大小。如果此时设置为0,即使网络正常的情况下也不会发送数据,拔不拔网线无所谓了。

c# Socket心跳试验,自定义发送包 和 使用KeepAlive第2张

我在心跳的地方记了日志,一直在写,但是WireShark监测不到有消息发送,主要是因为发送数据的大小是0。图:

c# Socket心跳试验,自定义发送包 和 使用KeepAlive第3张

但当我把第二个参数改成tmp.Length的时候(也就是1),就可以发送数据了。图:

c# Socket心跳试验,自定义发送包 和 使用KeepAlive第4张

我设置的是每隔7秒发送一次数据。

如果拔掉网线,当下次心跳检测的时候,就会报错。图:

c# Socket心跳试验,自定义发送包 和 使用KeepAlive第5张

最后一条红色的数据之后,就没有再见到有数据发送了。虽然这种方法可以检测Socket是否断开,但是不是很好,响应不及时。

使用KeepAlive

正常情况

WireShark会检测到不停的往Socket服务器发送消息,也就是心跳检测,图:

 c# Socket心跳试验,自定义发送包 和 使用KeepAlive第6张

三次握手建立连接之后(前三条),每隔3秒心跳检测一次,跟我在代码里面设置的一致。

在拔掉网线的情况下

WireShark监控到每隔1秒发送一次消息,检测10次后发送[RST]命令断开连接。注意看Time列,从16开始执行10次。这是win10系统默认设置。图:

c# Socket心跳试验,自定义发送包 和 使用KeepAlive第7张

参考网址:https://blog.csdn.net/elie_yang/article/details/95197181

免责声明:文章转载自《c# Socket心跳试验,自定义发送包 和 使用KeepAlive》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MySQL 字段类型占用空间【工具技巧】:sublime notepad++ 多行编辑下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【转】TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端

【转】TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端 目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP部分的使用 框架源码结构 补充说明 源码地址 说明 之前有好几篇博客在讲TCP/UDP通信方面的内容,也有做过一些Demo(包括整理出来的、可供学习使用的...

C#语言Windows服务程序测试网站发送HTTP请求超时解决办法

      我在用C#做Windows服务程序,一个每隔一定时间测试网站链接的程序,可是做的时候发现,发送的HTTP请求,每次都是只有2个是返回200,其他的都是Opretion over time[具体英文我忘了,反正就是操作超时]。弄了很久,由于对C# 不熟悉,以为是函数了解的不清楚的错,试了很多次,依然不成功。最后才想到百度“HTTPWebReque...

wireshark抓取mysql协议

一、wireshark抓取mysql协议报文 通过过滤条件过滤出报文 协议 mysql 或端口 tcp.port == 3306 注: mysql 协议默认分析的是 3306端口的数据;如果你的端口不是3306,请先在如下配置修改端口分析 wireshark-》编辑-》首选项-》protocol下找到myqsl 二、网络协议知识...

wireshark 路由过程抓包分析

首先收集每台设备的MAC地址以备分析: 服务器A:00-0c-29-bb-bb-7f 服务器B:00-0C-29-8C-BF-6D 默认网关:00-50-56-fe-c8-98 在服务器B上启动Wireshark,然后执行ping命令与A通信,此时Wireshark会将通信过程进行抓包。ping命令结束之后,停止抓包,我们首先来熟悉一下Wireshark的...

关于socket通信bind()返回值错误:10049

前几天偶尔收到一个朋友的求救,要编写一个IPV6的socket编程 开始以为这个问题很容易,因为socket已经兼容IPV4和IPV6的,改下那几个接口就可以了 然后....被卡住了.... 修改了参数为IPV6的参数以后,在bind的时候始终包10049错误. 按照MSDN的说法,10049的意思表示找不到那个IP. 但是我服务器端bind监听的sock...

WebSocket以及socketIO的使用

简介 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 现在,很多网站为了实现推送技术,所用的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出H...