日期:2014-05-16  浏览次数:20628 次

Linux socket文件传输,数据被覆盖
我最近在练习socket文件传输,用TCP协议,直接调用read和write读写套接字和读写文件,现在有一个问题,我从客户端上传文件到服务器端的时候,服务器端收到的数据总是比客户端发送的数据小,但是偶尔也相等,数据正常。
我猜测的一个问题是,在客户端这一边,当数据从应用程序的缓冲区拷贝到socket内核缓冲区的这点上出现问题,有可能是内核缓冲区中的数据还没完全发送出去,而应用程序的数据又拷贝数据进来,从而把没来得及发送的数据覆盖掉,导致问题的出现,是不是这样的?因为按照TCP流量控制机制,发送端的发送缓冲区是由接收方来通告的,所以作为接收方的服务器来说,他的缓冲区始终是能够接收完客户端发来的数据的,而不会被丢弃,或者被覆盖。
我现在的问题就是出现了数据被覆盖,但是我不确定是在哪一端被覆盖,到底是在客户端发送的时候被覆盖,还是服务器端接收的时候,还没来得及写文件而被覆盖?不是很清楚,希望群里的大牛指点一下,小弟非常感谢

------解决方案--------------------
socket通信时,不能期望单次调用完成全部数据的发送或接收
通常应该判断send或recv函数的返回值,循环处理,直到全部数据发送或接收完成
------解决方案--------------------
楼主的理解对了.
read,write
recv,send处理上有差别.