socket 传送文件丢包

glm62 2009-04-11 10:51:26
在做一个广域网上p2p的小活儿
用socket传文件
我就是用的send, Receive
每次发1k.
可发现个问题,发送接收都能成功,可接收完毕后,发现文件不完整,比实际的文件小
请问这是什么原因,能给出示例代码更好,谢谢.
...全文
243 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghq09 2011-09-08
  • 打赏
  • 举报
回复
仅供参考,也许你发送方发送的时候接收方正在做其他事情,等接收方开始接受,发送方已经发送完毕,这样的话文件的开头一部分会丢失,你看看是不是。可以让接收方先告诉发送方准备完毕,发送方再发送
xian_wwq 2009-04-13
  • 打赏
  • 举报
回复
所谓粘包,就是使用tcp接收数据时,
需要根据自己的需要对数据进行分包。
因为性能的问题,tcp在发送数据包时,会出现
多个小数据包一次发送,或者大数据包被拆分为多个包,需要多次接收。
所以接收和发送的数据长度不一致是正常的。

数据包边界的做法一般是:
在发送包头中加上本次发送数据的长度。
在接收端针对每个连接,建一个接收缓存。在接收到数据后,
判断接收的数据是不是和包头中的发送数据长度匹配。
如果小,则缓存,等待下一次接收,在下一次接收到数据后,进行包拼接。
如果大,则根据包头,读取正确长度的数据,将多余数据放入缓存。
循环进行。


beckfun 2009-04-12
  • 打赏
  • 举报
回复
在文件传输中加入验证!验证不通过,要求重新发送!
捷哥1999 2009-04-12
  • 打赏
  • 举报
回复
贴出代码来看看。
68435970 2009-04-12
  • 打赏
  • 举报
回复

//循环接收看下
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]);
}
}
glm62 2009-04-11
  • 打赏
  • 举报
回复
用的是TCP
楼上的老兄,什么是粘包 ,怎么避免
xian_wwq 2009-04-11
  • 打赏
  • 举报
回复
使用udp,在广域网上不可避免的要丢包;
如果使用tcp,要注意处理tcp粘包的问题;
而且发送包的大小最好做个限制。
itcoco 2009-04-11
  • 打赏
  • 举报
回复
用udp传输会丢包 tcp的不会丢,自己看下是不是丢数据了
YMsavage 2009-04-11
  • 打赏
  • 举报
回复
我只做过聊天的程序,具体的传送文件没做,但是可以把文件作为一个对象序列化后再传呀

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧