请问个socket的有关问题,send成功是不是数据一定发送到对方了

请教个socket的问题,send成功是不是数据一定发送到对方了?
服务端send成功后,数据是不是已经到达客户端的网卡了,或者说数据已经到达客户端的缓冲区,只要调用下recv就可以取出来了?
目前的情况是:TCP,客户端连接成功后循环recv接收文件,服务端accept后循环send,直到发完整个文件,然后close socket。有概率出现客户端快接收完的时候recv返回0,(MSDN上说是对方已经优雅的关闭了)
------解决方案--------------------
可以每次在send的时候发一下数据包的大小,并且在recv的地方拿收到的数据的大小和这个发送来的数据大小进行比较,成功和失败都在recv端再次发送给send结果就可以
------解决方案--------------------
返回值对了就说明send是成功了,以后的事它就不管了。

你是说发送完了,然后收到丢包了?
------解决方案--------------------
send成功了 说明已经将数据拷贝到发送缓存了,而发送缓存区的数据什么时候发,系统决定。

所以当你得到成功后,就断掉,可能会导致发送缓存的数据还没发出去

有个socket选项,关闭连接时,会将缓存全部发出去后,才关闭连接
------解决方案--------------------
send的过程,只是把数据复制进TCP协议栈中。类似于把货物装上火车。
------解决方案--------------------
仅就WinSock来说,send返回不代表数据已到达对方,而代表的是Ws2_32.dll已经将数据拷贝到下层服务提供者了。
------解决方案--------------------
不是