tcp ,send函数返回 不是socket_error,证明发送成功,这样我不用观察接收端,就能推理出接收成功了吗?

解决方案 »

  1.   

    应该是,TCP是双工的,如果对方没有接收到,就是发送失败
      

  2.   

    不可能。 发送的send返回的已经找到了目标机器。并且已经在网卡堆栈中!你可以自己试试
      

  3.   

    send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端。如 果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回SOCKET_ERROR。(每一个除send外的Socket函数在执 行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该Socket函数就返回 SOCKET_ERROR).
      

  4.   

    发送到缓冲区后,再发送到网络、重发等操作是socket协议栈做的事,并不能保证一定会送到目的端
      

  5.   

    即使等发送缓冲的数据发完也没Error,也不一定接收成功,得看底层的IP和网卡的封包大小是否填满,而且如果途中发生数据位错误,但是校验和不一定能发现。最好再另用CRC或MD5校验
      

  6.   

    tcp一定等对方接受好才有应答,否则没法继续。因此,你的发送可能成功,对方也应答了。
    问题出在对方没有专门发送给你数据。注意:对方的应答在应用层一般不可见。
      

  7.   

    理论上如果发送缓冲区设置为0,send成功就代表至少应该已经在发送的途中
      

  8.   

    如果你需要做确认. 
    自己再应用层设计一些数据结构,做一次确认即可.TCP是可靠连接,指的是网络层.和具体应用无关,
    如果你的应用和具体数据收发顺序有关,那就需要你自己安排确认.
      

  9.   

    1、send成功,只是代表数据已经发到发送缓存中,并不代表发送到目的地,
    发送缓存的数据由网络层协议来保证发送到目的端,tcp是面向连接的,全双工模式。一般来说,都会成功。2、网络层协议把数据成功发送到目的地址,只是把数据放到接收端的接收缓存中,接收端没有recv的话,数据还是没有成功被接收。不停是send,接收缓存会用完。
    3、接收缓存满后,网络层就不会再发送数据过来。
    这样当你再次send的时候,就只是把数据放到发送缓存而已,发送缓存满后,则send函数会失败。
      

  10.   

    同步阻塞模式下,send返回意味着接收方成功接收(socket协议栈)
    异步非阻塞,send显然只是拷贝数据到缓存区
      

  11.   

    1.如果缓冲区大,放到缓冲区,如果是0,那么在路上,但一般都不是0
    2.放到缓冲区和路上不代表对方收到了
    3.如果网络一切正常,网线没有掉、到对方的路由没有问题,TCP会确保数据在某个时候到达对方,即使丢失了,它也会重传,这是TCP必须保证的。
    4.TCP的ACK是在协议栈实现的,应用层不知道
    5.如果这个时候程序退出,对方不一定收到数据。
      

  12.   

    1楼答案正确!
    send成功并不能表示已经发送到了对方,
    而只能表示已经丢到了本地的发送缓冲区!