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

解决方案 »

  1.   

    我有个疑问。如果建立了TCP连接只要你不断开,那么通道不是始终都存在么。
      

  2.   

    客户端和服务器如果意外断电或拔网线,TCP机制是不会检查出来的,所以要加入心跳包,但是加入后发现服务器没回复,导致客户端误以为服务器断开连接。
      

  3.   

    心跳包不用那样去写。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中引发异常,根据异常就可以断开连接了。