本人用TServerSocket做了一个服务端程序,用的是THREAD模式,
客户端是公司自开发的硬件,前2个星期测试一点问题都没有。最近这周测试时发现2个问题:
1 通讯包SACK错误,我BAIDU了,好象是包重复了,情况出现的比较少,出现了我的SERVER端就收不到数据。
2 在通讯过程偶尔会出现一个异常,TCP header length:13 bytes( must be at least to 20 bytes)
  出现这个包后(客户端发过来的) 我的SERVER端也出现不能接收数据的问题。接收数据在THREAD中处理的,如下:
pStream := TWinSocketStream.create(ClientSocket,timeOut);
 if pStream.WaitForData(ReadTimeOut) then出现上面的问题我DEBUG,发现线程没有问题,还在正常进行,就是不能收到数据
另外在出现这样的情况后,我将SOCKE提取出来,主动发送下去,通过监视,客户端能收到数据,我的服务端还是不行请各位高手指点一二,本人第一个正式的SOCKE通讯程序。谢谢。

解决方案 »

  1.   

    晕!
    再顶个,就不信CSDN无人
      

  2.   

    个人以为是硬件当中实现TCP/IP协议出现问题.没有加以处理.
      

  3.   

    我个人也是这样认为的,不过我想我也能主动处理这样的问题。
    今天找到一个关于TCP包异常资料:
    对于数据包过短或过长的包,我们通常的情况是置m_DataBufByteCount为0,即舍弃当前包的处理。如果此处不设置m_DataBufByteCount为0也可,但该客户端只要发了一次格式错误的包,则其后继发过来的包则也将连带着产生格式错误,如果设置m_DataBufByteCount为0,则可以比较好的避免后继的包受此包的格式错误影响。更好的作法是,在此处开放一个封包格式异常的处理接口(OnPacketError),由上层逻辑决定对这种异常如何处置。比如上层逻辑可以对封包格式方面出现的异常进行计数,如果错误的次数超过一定的值,则可以断开该客户端的连接。我现在的想法是将这个在控件中舍弃处理,这样能兼容这个错误。个人认为硬件实现非常完整的TCP协议是不容易的,难度也大。
    我在控件属性中找了很久,没有相关的属性可以处理,正在找其它资料。
    谢谢楼上兄弟关心。
    本贴人人有分,不够的再开,希望大家能扩展下,一起研究TCP SOCKET通讯。
      

  4.   

    如果是TCP报文出错,你在应用层是无法处理的,除非你也使用RAW_SOCKET
      

  5.   

    如果自己用API封装,是个比较大的挑战。
    谢谢兄弟的指点。