最近做socket保持长连接的一些心得

C#使用TCP/IP长连接获取数据、心跳检测 【代码】C#使用TCP/IP长连接获取数据、心跳检测。 阅读详情

来自:http://s.yanghao.org/program/viewdetail.php?i=2945

自己写的客户端马上要发布了,忽然发现了一大堆问题,主要集中在与服务器的TCP连接经常莫名断开,客户端又检测不到,不能及时重连。一个多星期的修改,有一些心得,与大家分享。也希望大家多发表意见,您的意见也许最后就实现在我的软件中了!

主要分为两部分:
一,如何更好的检测TCP连接是否正常
二,如何提取本机TCP连接状态

一,如何更好的检测TCP连接是否正常
这方面问题,我上网查了很久,一般来说比较成熟的有两种方法:
1是在应用层制定协议,发心跳包,这也是C#,JAVA等高级语言比较常用的方法。客户端和服务端制定一个通讯协议,每隔一定时间(一般15秒左右),由一方发起,向对方发送协议包;对方收到这个包后,按指定好的通讯协议回一个。若没收到回复,则判断网络出现问题,服务器可及时的断开连接,客户端也可以及时重连。
2通过TCP协议层发送KeepAlive包。这个方法只需设置好你使用的TCP的KeepAlive项就好,其他的操作系统会帮你完成。操作系统会按时发送KeepAlive包,一发现网络异常,马上断开。我就是使用这个方法,也是重点向大家介绍的。

使用第二种方法的好处,是我们在应用层不需自己定协议,通信的两端,只要有一端设好这个值,两边都能及时检测出TCP连接情况。而且这些都是操作系统帮你自动完成的。像我们公司的服务端代码就是早写好的,很难改动。以前也没加入心跳机制,后面要改很麻烦,boss要求检测连接的工作尽量客户端单独完成....
还有一个好处就是节省网络资源。KeepAlive包,只有很简单的一些TCP信息,无论如何也是比你自己设计的心跳包短小的。然后就是它的发送机制,在TCP空闲XXX秒后才开始发送。自己设计心跳机制的话,很难做到这一点。

这种方法也是有些缺陷的。比如某一时刻,网线松了,如果刚好被KeepAlive包检测到,它会马上断开TCP连接。但其实这时候TCP连接也算是established的,只要网线再插好,这个连接还是可以正常工作的。这种情况,大家有什么好办法处理吗?

C#中设置KeepAlive的代码
  uint dummy = 0;
  byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3];
  BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0);
  BitConverter.GetBytes((uint)15000).CopyTo(inOptionValues, Marshal.SizeOf(dummy));
  BitConverter.GetBytes((uint)15000).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2);

  IPEndPoint iep = new IPEndPoint(this._IPadd, xxxx);
  this._socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  this._socket.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null);
  this._socket.Connect(iep);
这里我设定TCP15秒钟空闲,就开始发送KeepAlive包,其实完全可是设定得长一点。


二,如何提取本机TCP连接状态
设好了KeepAlive值,又遇到麻烦了,我没找到当网络异常时,它断开连接后怎么通知我...我搜了很久都没找到,要是哪位兄弟知道的话告诉我吧。我是使用笨办法的,找到所有本地TCP连接的信息,筛选出我需要的那个TCP。
查看本机所有TCP连接信息,网上一般的方法,都是通过程序调用CMD命令里的netstat进行,然后再分析其内容。但在CMD窗口用过这个命令的都知道,悲剧的时候它显示完所有TCP信息需要15s,或者更长时间,这在我的程序中是不能忍受的。
然后我又查找了一些牛人的博客,发现有人提到用iphlpapi.dll。这是一个在win98以上操作系统目录System32都包含的库函数,功能异常强大,大家可以放心使用!但是使用起来比较麻烦,基本找不到C#现成使用的例子,就算有,也是很老版本的,完全不能用
我参考了这两位高人的博客
http://blog.youkuaiyun.com/yulinlover/archive/2009/02/08/3868824.aspx
(另一位的博客连接找不到了..悲剧啊!)
下载了里面提到的项目,仔细结合自己体会进行修改,终于能用了。每隔一段时间,我的客户端就用这个方法扫描一遍本地TCP信息,若发现连接有问题,则断开重连。
这个方法能瞬间得到本机所有TCP连接信息(如果你有兴趣可以扩充,它的功能真的是太强大了),没有CMD命令netstat那不能忍受的延迟,相当好用。代码比较长,就不贴出来了。


这些是我不太成熟的做法,下星期项目就要提交了,不能再出啥岔子,希望大家多提意见,帮我改善一下。
本版人气很旺,但貌似用socket的人不多,不知道帖子发这是否合适。要是不合适,请前辈提点下发在哪个版比较好?

C#实现VPN客户端 3、当VPN连接成功后,可以使用Socket Programming API创建虚拟网卡,该网卡实际上是操作系统内核中的一个设备。创建虚拟网卡时需要管理员权限。4、最后需要使用Raw Socket发送IP数据包,将数据包发送给虚拟网卡处理。2、接下来需要发送VPN配置信息,包括加密方式、IP地址、DNS等信息。这些信息可以从VPN配置文件中读取。1、首先需要建立一个TCP连接,连接到VPN服务器。连接时需要使用用户名和密码进行身份验证。实现VPN客户端需要涉及到很多底层网络编程知识。 阅读详情

相关推荐

android Socket长连接及多客户端管理

一、简介 最近在做一个项目,需要用到socket 。具体功能为:在同一wifi下,一个手机作为服务器端,另一个(或多个)手机作为客户端,客户端自动获取服务器的ip,通过socket建立常连接,用客户端手机发送指令控制服务器端的手机。 二、分析: 1、服务器端: (1)首先服务器端需要告诉同wifi下的客户端自己的ip,所以使用UDP广播,可见我的上一篇文章:http://blog.csdn

suyiyang888的专栏 3689

做socket保持长连接的一些心得

做socket保持长连接的一些心得 - chen_scor的日志 - 网易博客做socket保持长连接的一些心得    2010-07-21 19:43:58|  分类: dotnet开发 |  标签:  |字号 大中小 订阅http://www.dnbcw.com/biancheng/c/hgdc106706.html最近做socket保持长连接的一些心得,欢迎大家讨论 - .NET技术 / ...

weixin_33739523的博客 914

android Socket长连接既做客户端又做服务器

一、简介最近在做一个项目,需要用到socket 。具体功能为:在同一wifi下,一个手机作为服务器端,另一个客户端,通过socket建立常连接,手机收发送指给客户端。二、分析:1、服务器端:(1)服务端需要开启多线程任务,与多个客户端保持常连接。2、客户端:(1)使用socket建立连接三、具体实现:1、服务器端(1)使用后台服务,创建类SocketService,因为要随时接收客户端的信息,所以...

qq_26631727的博客 2293

Socket 死连接详解

  当使用 Socket 进行通信时,由于各种不同的因素,都有可能导致死连接停留在服务器端,假如服务端需要处理的连接较多,就有可能造成服务器资源严重浪费,对此,本文将阐述其原理以及解决方法。   在写 Socket 进行通讯时,我们必须预料到各种可能发生的情况并对其进行处理,通常情况下,有以下两种情况可能造成死连接: 通讯程序编写不完善 网络/硬件故障   a) 通讯程序编写不完善...

weixin_34315189的博客 391

android使用websocket保持长连接 后台为nodejs带心跳检测

本人原来是java工程师,但是最近没事就干起了android的活,我的具体需求是android使用websocket保持长连接 后台为nodejs 由于个人也是一个小白 被好几个bug弄得死去活来 后面会给大家说一下的 好了 不多说 开撸 nodejs方面使用的是nodejs-websocket,而不是http+ws+socket.io,使用后者在我的android代码会有bug:流意外断开(下图...

meet_zzs的博客 1619

Mina 长连接实践

- Mina介绍最近项目需要使用长连接,而Mina应该是个不错的选择。个人在Mina的长连接的集成过程中碰到一些问题解决,现在和大家探讨下。言归正传,要使用Mina首先需要看看Mina的官网,特别是他的开发文档需要阅读下(http://mina.apache.org/mina-project/documentation.html)。个人觉得以下二张图是比重要的(来自于http://mina.apac

7519

工作中SVN的使用,保姆级教程!

SVN是一款集中式版本控制系统,采用客户端-服务器模式管理代码版本。与Git相比,SVN在目录权限控制、大型二进制文件处理等方面具有优势,适合特定场景使用。本文介绍了SVN的安装方法、基本操作(检出、提交、更新、回滚等)以及分支管理(创建、合并、切换)。同时讲解了文件冲突的解决方法,并演示了如何在IDEA中集成SVN工具。SVN虽然逐渐被Git取代,但在某些特定场景下仍是可靠选择,工具选择应基于团队和项目需求。

胜人者有力,自胜者强! 1849

最近做socket保持长连接的一些心得,欢迎大家讨论

自己写的客户端马上要发布了,忽然发现了一大堆问题,主要集中在与服务器的TCP连接经常莫名断开,客户端又检测不到,不能及时重连。一个多星期的修改,有一些心得,与大家分享。也希望大家多发表意见,您的意见也许最后就实现在我的软件中了! 主要分为两部分: 一,如何更好的检测TCP连接是否正常 二,如何提取本机TCP连接状态 一,如何更好的检测TCP连接是否正常 这方面问题,我上网查了很久

1487

SCU【C】程序设计基础期末安全项目lab2-Deadbeef-writeup(附题目&源码)

项目名称(本质:栈溢出攻击)【源码在文首】和lab1一样,此题又是美国卡耐基梅隆大学的平时作业哈哈哈! 项目要求是把栈溢出,强行更改函数返回值,输出0xdeadbeef。

2301_79586491的博客 1544

CVPR 2024 LaTeX 模板实战:从匿名提交到图表排版的避坑指南

本文详细解析CVPR 2024 LaTeX模板的使用技巧,涵盖匿名提交设置、pdfLaTeX编译器选择、图表排版优化等关键环节。通过实战案例演示智能引用、公式编号、三线表制作等专业技巧,帮助研究者高效完成论文格式规范,规避常见排版错误。特别针对双栏格式下的图片定位、跨栏表格等复杂场景提供解决方案。

weixin_42561040的博客 453

C# TCP socket保持长连接

2010-07-21 19:43:58|分类:dotnet开发|标签:|字号大中小订阅 http://www.dnbcw.com/biancheng/c/hgdc106706.html 最近做socket保持长连接的一些心得,欢迎大家讨论 - .NET技术 / C# 简介:这是最近做socket保持长连接的一些心得,欢迎大家讨论 - .NET技术 / C#的详细...

Peter的博客 5730

基于NXP i.MX RT1180的无传感器FOC电机驱动实战指南

磁场定向控制(FOC)是一种先进的电机控制技术,它通过精密的数学变换,将三相交流电机的控制解耦为独立的转矩和磁场分量,从而实现高效、平稳、低噪音的驱动。其核心原理在于利用Park/Clark变换,在旋转坐标系下对电流进行线性控制。这项技术的价值在于显著提升了永磁同步电机(PMSM)的效率与动态性能,广泛应用于机器人、无人机和工业自动化等高精度场景。本文聚焦于利用NXP i.MX RT1180跨界处理器及其MCUXpresso SDK,快速实现一套完整的无传感器FOC解决方案。通过解析硬件平台选型、软件架构,

weixin_33925615的博客 302

android socket 长连接_java-socket长连接demo体验

一、前言最近公司在预研设备app端与服务端的交互方案,主要方案有服务端和app端通过阿里iot套件实现消息的收发;服务端通过极光推送主动给app端推消息,app通过rest接口与服务端进行交互;服务端与app通过mqtt消息队列来实现彼此的消息交互;服务端与app通过原生socket长连接交互。虽然上面的一些成熟方案肯定更利于上生产环境,但它们通讯基础也都是socket长连接,所以本人主要是预研了...

weixin_39640417的博客 365

手把手教你用QEMU虚拟化华为路由器固件(附完整网络配置指南)

本文提供了一份详尽的QEMU虚拟化华为路由器固件的实战指南。从固件解包、网络桥接配置到QEMU虚拟机启动,手把手教你搭建完整的嵌入式设备沙箱环境,特别适合安全研究、逆向分析和学习嵌入式系统工作原理。

tgb3456789的博客 937

Synares病毒实战:如何手动清除C盘隐藏的Synaptics.exe(附资源修复脚本)

本文详细介绍了Synares感染型病毒的手动清除方法,该病毒伪装成Synaptics触摸板驱动,感染EXE和XLSX文件。文章提供了从病毒行为分析、母体清除到被感染文件修复的全流程指南,并附有实用的资源修复脚本和防御加固方案,帮助用户彻底清除这一顽固病毒。

lg888的博客 2326

java socket断开重连_Java的Socket长连接掉线问题!

你的位置:问答吧-> JAVA-> 问题详情Java的Socket长连接掉线问题!大家好,我们现在做了一个基于校园网(一般的大学,大概3-4万人,网络环境很复杂)的电表数据采集系统,下位机客户端采用嵌入式的C写的Socket客户端,上位数据采集中心采用的Java的多线程、ServerSocket,因为要支持即时...

weixin_39541600的博客 2354

【运动规划算法项目实战】如何使用Pure Pursuit算法进行路径跟踪(附ROS C++代码)

在自动驾驶和机器人导航领域,路径跟踪是一项关键技术,它使车辆或机器人能够按照预定的路径规划进行移动。路径跟踪算法的选择对于系统性能和安全性至关重要。本文将介绍一种常用且有效的路径跟踪算法——Pure Pursuit算法。我们将详细讨论Pure Pursuit算法的原理、实现步骤以及如何在自动驾驶和机器人系统中应用该算法进行路径跟踪。Pure Pursuit是一种用于路径跟踪的控制算法。它通过计算角速度控制机器人从当前位置移到机器人前方的某个预瞄点。假定线速度是恒定的,当然可以随意更改机器人的线速度。

xiewf的博客 1万+

关于socket长连接的心跳包

出于最近对im研究的兴趣,看到smack里有个30s发送一个空消息的线程,了解了下关于心跳包,keepalive的知识。 TCP的socket本身就是长连接的,那么为什么还要心跳包呢? 搜索到的资料解释如下: 一:内网机器如果不主动向外发起连接,外网机没法直连内网的,这也是内网机安全的原因之一吧,又因为路由器会把这个关系记录下来,但是过一段时间这个记录可能会丢失 ,所有每一个客户端每隔一定时间

iamdesmo的专栏 1万+

GEE:随机森林分类教程(样本制作、特征添加、训练、精度、参数优化、贡献度、统计面积)

本文将介绍在Google Earth Engine (GEE)平台上进行随机森林分类的方法和代码,其中包括制作样本点教程(本地、在线和本地在线混合制作样本点,合并样本点等),加入特征变量,运行随机森林分类器教程,计算随机森林分类结果的精度,优化随机森林分类算法的参数,打印各个变量特征的贡献度等步骤的方法和代码。本教程可以应用于多种分类场景,包括土地利用分类、种植区提取(大蒜、小麦、玉米等)、局部气候区分类、植被分类等多种场景。

养乐多的博客 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

python使用socket实现协议TCP长连接框架

点击上方↑↑↑蓝字[协议分析与还原]关注我们“使用python实现协议中常见的TCP长连接框架。”分析多了协议就会发现,很多的应用,特别是游戏类和IM类应用,它们的协议会使用长连接的方式...

协议分析与还原 3780

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

android socket 定时器,Socket 怎样三次握手,怎样保持长连接

通过IP地址,端口号,协议号进行通信识别TCP/IP通常采用5个信息来识别一个通信。它们是,源IP地址,目标IP地址,协议号,源端口号,目标端口号。server的生命周期大致如下:1、创建socket。2、绑定(bind)地址端口3、监听网络连接4、接受连接5、关闭连接client的生命周期则稍微简单点:1、创建socket2、绑定地址3、发起连接4、关闭连接socket与握手细节握手的连接发生在...

weixin_29533307的博客 465

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java-socket长连接demo体验

一、前言 最近公司在预研设备app端与服务端的交互方案,主要方案有: 服务端和app端通过阿里iot套件实现消息的收发; 服务端通过极光推送主动给app端推消息,app通过rest接口与服务端进行交互; 服务端与app通过mqtt消息队列来实现彼此的消息交互; 服务端与app通过原生socket长连接交互。 虽然上面的一些成熟方案肯定更利于上生产环境,但它...

KHOST的博客 480

简单的socket长连接

最近做SSO的项目,其中用到了socket长连接.一直都是看代码的,但是要求socket做成SSL的,不得不动手写写代码了.下面我给出一个简单的socket长连接. SocketClient.java

软件开发积累 1215
上一篇: C#里获取系统托盘信息
下一篇: 少编码多思考:代码越多 问题越多
ArvinStudy
博客等级 码龄15年 83粉丝 193原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值