看资料上说,tcp协议为保证数据能够可靠地传输,会在数据包之间维持状态信息,这些状态信息可以保证数据进行可靠的传递。例如,发送方可以记住什么数据发送出去了还没有得到确认,什么数据是什么时候发送出去的。如果一定时间间隔后没有得到应答,发送方就重发该数据。接收方可以记住什么数据已经接收到了,而且可以丢弃重复的数据。如果数据包没有按顺序到达,那么接收方可以先保存数据,等待逻辑上先于它的数据包到达。
  我理解这些机制应该是TCP协议自身实现的,不需要在程序中做一些编码操作。可是我在一个程序中看到,它在代码中设置了发送超时时间和接收超时时间,这是怎么回事?
  当我用WinSock的API开发客户端网络程序时,需要考虑到发送超时或是接收超时的处理吗?
  我是每隔1分钟向服务器端发送一组数据,如果程序中检测到send或是recv返回值为SOCKET_ERROR,是不是就可以断定网络连接断开了(如果不这样,那在发送和接收过程中如何判断网络连接断开了?)?此时不调用closesocket(),直接调用connect()连接服务器可以吗?还是说当网络连接断开后必须先closesocket()才行?
  问题有点多,但都是基础性的问题,盼望高手给解答一下。多谢

解决方案 »

  1.   

    我理解这些机制应该是TCP协议自身实现的,不需要在程序中做一些编码操作。可是我在一个程序中看到,它在代码中设置了发送超时时间和接收超时时间,这是怎么回事?
    -----------------------------------------------------------------------------------------------如果非正常网络断开比如网线断啦 客户端没有通知服务端关闭链接, 所以要设置超时
      

  2.   

    nonblocking tcp下
    接收需要超时判别,发送不要。
      

  3.   

    blocking下
    接收/发送都要 timeout
      

  4.   

    看情况了,但是我认为需要,TCP说的都是协议本身的功能,但是协议不能保证应用层收发数据的可靠性。
      

  5.   

    当我用WinSock的API开发客户端网络程序时,需要考虑到发送超时或是接收超时的处理吗?
      我是每隔1分钟向服务器端发送一组数据,如果程序中检测到send或是recv返回值为SOCKET_ERROR,是不是就可以断定网络连接断开了(如果不这样,那在发送和接收过程中如何判断网络连接断开了?)?此时不调用closesocket(),直接调用connect()连接服务器可以吗?还是说当网络连接断开后必须先closesocket()才行?
    -------------------------------------
    1 当你设置了发送与接收超时,当然要考虑。
    2 检测到send或是recv返回值为SOCKET_ERROR,是不是就可以断定网络连接断开了(如果不这样,那在发送和接收过程中如何判断网络连接断开了?)?
       答:返回值为SOCKET_ERROR不一定是网络连接断了,不能通过返回值来判断网络连接断开,通常用发送心跳包来做。
    3 此时不调用closesocket(),直接调用connect()连接服务器可以吗?还是说当网络连接断开后必须先closesocket()才行. 
      答:若发送send错误与recv错误,根据返回的错误码来处理。具体情况具体分析。参见MSDN。
      

  6.   

    我一般用select来实现接收,不管什么情况(网线拔了,对方关闭了套接字等)我都能收到信号
      

  7.   

    在Block模式下,发送和接受都是有超时的,而且时间很长的。这对应用程序的性能是有影响的,因为等待的时间太长了,需要显示设置超时。一般是先用select函数来事先检查socket是否可读可写,在设置的规定时间内返回。然后用send and recv读写数据了。这样就避免了长时间等待。