socket 传送文件丢包
在做一个广域网上p2p的小活儿用socket传文件
我就是用的send, Receive
每次发1k.
可发现个问题,发送接收都能成功,可接收完毕后,发现文件不完整,比实际的文件小
请问这是什么原因,能给出示例代码更好,谢谢.
--------------------编程问答-------------------- 我只做过聊天的程序,具体的传送文件没做,但是可以把文件作为一个对象序列化后再传呀 --------------------编程问答-------------------- 用udp传输会丢包 tcp的不会丢,自己看下是不是丢数据了 --------------------编程问答-------------------- 使用udp,在广域网上不可避免的要丢包;
如果使用tcp,要注意处理tcp粘包的问题;
而且发送包的大小最好做个限制。 --------------------编程问答-------------------- 用的是TCP
楼上的老兄,什么是粘包 ,怎么避免 --------------------编程问答-------------------- 贴出代码来看看。 --------------------编程问答-------------------- 在文件传输中加入验证!验证不通过,要求重新发送! --------------------编程问答--------------------
--------------------编程问答-------------------- 所谓粘包,就是使用tcp接收数据时,
//循环接收看下
while (true)
{
int data = handler.Receive(bytes, bytes.Length, 0);
Loading.string_Loading = "正在从服务端接收数据......";
if (data <= 0)
break;
for (int j = 0; j < data; j++)
{
listBytes.Add(bytes[j]);
}
}
需要根据自己的需要对数据进行分包。
因为性能的问题,tcp在发送数据包时,会出现
多个小数据包一次发送,或者大数据包被拆分为多个包,需要多次接收。
所以接收和发送的数据长度不一致是正常的。
数据包边界的做法一般是:
在发送包头中加上本次发送数据的长度。
在接收端针对每个连接,建一个接收缓存。在接收到数据后,
判断接收的数据是不是和包头中的发送数据长度匹配。
如果小,则缓存,等待下一次接收,在下一次接收到数据后,进行包拼接。
如果大,则根据包头,读取正确长度的数据,将多余数据放入缓存。
循环进行。
--------------------编程问答-------------------- 仅供参考,也许你发送方发送的时候接收方正在做其他事情,等接收方开始接受,发送方已经发送完毕,这样的话文件的开头一部分会丢失,你看看是不是。可以让接收方先告诉发送方准备完毕,发送方再发送
补充:.NET技术 , C#