在同步状态下:
TCP协议,使用send发送数据,但是此send 函数只是把数据交给了底层来完成,却不知道数据究竟有没有成功发送,我关闭NAGLE算法,send一些数据,这样应该能够保证地层把数据发送出去吧?而据我所知,TCP可以通过对方的返回ACK数据来判断数据是否安全到达,但是,如果我可以使用什么方法可以在send后阻塞下来,不调用recv来判断数据是成功发送还是失败呢?
(例如具体这个情况下:客户端connect服务器后,拔掉服务器的网线,然后客户端send数据,我接下来怎样阻塞下来判断发送是成功还是失败?)

解决方案 »

  1.   

    如果你只使用send函数,那么,当send()返回值等于你需要发送的数据尺寸时,发送就成功.在TCP层,如果send()成功,就表示发送一定成功(对方已经收到).TCP本身就是面向连接的协议.,
      

  2.   

    If no error occurs, Send returns the total number of characters sent. 
    (Note that this can be less than the number indicated by nBufLen.) Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling GetLastError. 不同的GetLastError. 各不相同。你说的“如果我可以使用什么方法可以在send后阻塞下来,不调用recv来判断数据是成功发送还是失败呢?”我不理解,这两者的配套保证了正常的通信呀。。------------------------------------------
    网络方面实在不怎么样,见谅。
      

  3.   

    我只知道用MFC中的CAsyncSocket类,在OnSend()中能判断。
    -----网络还没入门呢--------
      

  4.   

    客户端connect服务器后,拔掉服务器的网线,然后客户端send 发送10个字节的数据?
    这时send返回成功发送字节为10,但是实际上并没有发送到对方服务器,只是交给了系统底层
      

  5.   

    TCP的发送成功只是意味着发送到对等方的TCP缓冲内,但并不表示对等方的应用程序可以成功接受到数据
      

  6.   

    pu4yang
    客户端connect服务器后,拔掉服务器的网线,然后客户端send 发送10个字节的数据?
    这时send返回成功发送字节为10,但是实际上并没有发送到对方服务器,只是交给了系统底层你这段话有问题,是同步模式的话,发送数据出去没有得到对方的确认时send就不会返回。
    同意finix兄所说的!
      

  7.   

    send的返回值正确就已经说明发送成功,你说得ACK实际上已经收到,send才会
    正确返回,这些都是TCP协议做的,不需要你考虑的。
      

  8.   

    你说的情况,send应该不会正常返回,不信你试试。
      

  9.   

    天下人好像都以为我在撒谎,起始我没有!
    我的看法:send成功,并且返回的发送字节数与待发送字节相同,只是意味着成功把数据交给系统底层进行了传送;并不意味着已经收到了对方的ACK,甚至不能确定数据已经到达对方;我所做的实验:
    运行环境:客户端,服务器端均为Windows 2000 Server;
    客户端connect服务器后,
    拔掉服务器的网线,然后客户端send 发送10个字节的数据,
    int nSend=send(m_hSocket,pch,nSize,0);
    程序顺利返回:nSend==nSize;我关闭了nagle算法,如果不关闭他,我们甚至不能保证send的数据立刻就由系统底层进行传送,系统底层可能要等到需要发送的字节到一定的数量后才真正进行传送,
    而对方的ACK也不一定就是收到一个就进行ACK,它可能对连续的几个进行一次ACK,所以,何为发送成功? 为了澄清这一问题,我建议大家把这个过程也试验一下!!!!
      

  10.   

    我试过了.你需要SEND两次的,第一次会成功,但第二次就会返回失败了.
      

  11.   

    int ret = m_talkServerSocket.Send(buff, sendbufflen);
    if(ret==SOCKET_ERROR)
    {
    //失败
    }