当前位置:编程学习 > C#/ASP.NET >>

帮帮忙啊,我用c#做的TCP连接加了心跳包,但是没收到回复!!!

是这样的:
我用c#编写了服务器,同事用C写的客户端主要向服务器发送数据,用TCP连接,为了检测意外断开的网络,加了心跳包。
客户端每3分钟发个心跳包,若没收到服务器回复就隔40秒发,超过三次便认定与服务器断开连接。但是客户端会经常没收到服务器的回复,然后断开再重连。服务器那边处理客户端发来的数据和心跳包都是同一个函数。而且我另外用c#写的另外一个客户端主要接收服务器的数据,总共就出现两次心跳包没回复而断开连接。


各位有遇到这样的情况吗?怎么处理啊? --------------------编程问答-------------------- 我有个疑问。如果建立了TCP连接只要你不断开,那么通道不是始终都存在么。 --------------------编程问答-------------------- 抓包看看有没有发过去?在另一台电脑上抓包看看有没有收到?有没有回应; --------------------编程问答--------------------
引用 1 楼 skygpan 的回复:
我有个疑问。如果建立了TCP连接只要你不断开,那么通道不是始终都存在么。

客户端和服务器如果意外断电或拔网线,TCP机制是不会检查出来的,所以要加入心跳包,但是加入后发现服务器没回复,导致客户端误以为服务器断开连接。 --------------------编程问答--------------------
引用 2 楼 lianshaohua 的回复:
抓包看看有没有发过去?在另一台电脑上抓包看看有没有收到?有没有回应;

额,怎么抓包啊?不懂啊 --------------------编程问答-------------------- 心跳包不用那样去写。C#和C都可以调用IoControl的指令。在c#中是这样

byte[] inValue = new byte[] { 1, 0, 0, 0, 0x88, 0x13, 0, 0, 0x88, 0x13, 0, 0 }; 
Socket.IOControl(IOControlCode.KeepAliveValues, inValue, null);

连接后执行一下上面的,就会在五秒之后每五秒发一次心跳包。0x1388是5000毫秒,可以自己设置。C中也有相应的调用方式。
这样设置之后,当心跳包超时(印象中默认应该是30秒)未接到,会在receive中引发异常,根据异常就可以断开连接了。 --------------------编程问答-------------------- 现在一台机器上试试,跑通了在部署到服务器
另外要确定防火墙不拦截心跳包 --------------------编程问答--------------------
引用 5 楼 lizhibin11 的回复:
心跳包不用那样去写。C#和C都可以调用IoControl的指令。在c#中是这样

C# code

byte[] inValue = new byte[] { 1, 0, 0, 0, 0x88, 0x13, 0, 0, 0x88, 0x13, 0, 0 }; 
Socket.IOControl(IOControlCode.KeepAliveValues, inValue, null);
……

用了,但是没办法判断断电和拔网线的情况 --------------------编程问答--------------------
引用 6 楼 isline 的回复:
现在一台机器上试试,跑通了在部署到服务器
另外要确定防火墙不拦截心跳包

都是局域网,心跳包是自己写的协议,应用层的 --------------------编程问答--------------------
引用 7 楼 a2bvchen 的回复:
引用 5 楼 lizhibin11 的回复:
心跳包不用那样去写。C#和C都可以调用IoControl的指令。在c#中是这样

C# code

byte[] inValue = new byte[] { 1, 0, 0, 0, 0x88, 0x13, 0, 0, 0x88, 0x13, 0, 0 };
Socket.IOControl(IOControlCode.KeepAliveV……

我测试过几十次了都可以的,而且这种方式应用了也有一年了,都可以判断出来. --------------------编程问答-------------------- 旧的问题没解决,现在又发现,一个客户端连上去,另一个客户端会掉线,这是为什么? --------------------编程问答--------------------
引用 10 楼 a2bvchen 的回复:
旧的问题没解决,现在又发现,一个客户端连上去,另一个客户端会掉线,这是为什么?


逻辑问题吧! --------------------编程问答--------------------
引用 10 楼 a2bvchen 的回复:
旧的问题没解决,现在又发现,一个客户端连上去,另一个客户端会掉线,这是为什么?


用消息驱动啊 --------------------编程问答-------------------- 请问楼主的问题解决了没有啊?
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,