程序一般运转正常,但有时会“失连”。这之后又有2种情况,1是自动重连几次后可以连上,2是死也连不上了。    具体情况:自定义5秒一个的握手消息(客户端发起),服务器收到后回复。一般用于服务器无消息发给客户端时。“失连”情况出现时,用底层嗅探器测试,发现客户端发的消息服务器回复了ack(tcp协议的确认),但是服务器却没有回复 反向握手信号,并且从服务器打印调试信息看 服务器收到信号并send成功,但是嗅探器并没有看到网络上有这些消息。
    于是,估计这些消息已经发到socket缓冲区,但socket并没有发出来,我没有改缓冲区大小,默认是8K。
    问题1:这种情况问题是在哪?
        2:如果设置了TCP_NODELAY 或者 扩大发送缓冲区 会好些吗?
        3:为什么ack会有呢?(数据区长度为0的tcp自己的消息)
        4:一般运行都正常,会是因为网络环境的问题吗?或者是因为服务器端要发送大量的数据包造成阻塞,但tcp明明可以保证可靠性啊?
        5:有时可以重连上,有时又不行(大部分不行)?这个跟服务器端的监听没关系吧?socket断了 服务端listen也应该自动释放的啊??(郁闷中、、、)
    注:服务器端是采用vxworks的实时信息采集处理板,建立的socket是 非阻塞的。    ps:本想发在嵌入式那边的,但想还是发在这边好些,希望tcp高手帮帮忙!谢先!

解决方案 »

  1.   

    很可能是网络不稳定。
    TCP的可靠性是发送方能够知道对方收到了数据,而对udp来说发送方并不一定知道对方已经收到数据了(不过可以在接收方进行回复也可以做到TCP的可靠性)
      

  2.   

    应该是应用层不能及时打开已经连接的TCP,而tcp的连接队列已经满了。
    但应该怎么解决呢?:(
      

  3.   

    设置延时,NODELAY,使用SELECT方式