当前位置:编程学习 > C#/ASP.NET >>

socket 传送文件丢包

在做一个广域网上p2p的小活儿
用socket传文件
我就是用的send, Receive
每次发1k.
可发现个问题,发送接收都能成功,可接收完毕后,发现文件不完整,比实际的文件小
请问这是什么原因,能给出示例代码更好,谢谢.
--------------------编程问答-------------------- 我只做过聊天的程序,具体的传送文件没做,但是可以把文件作为一个对象序列化后再传呀 --------------------编程问答-------------------- 用udp传输会丢包 tcp的不会丢,自己看下是不是丢数据了 --------------------编程问答-------------------- 使用udp,在广域网上不可避免的要丢包;
如果使用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接收数据时,
需要根据自己的需要对数据进行分包。
因为性能的问题,tcp在发送数据包时,会出现
多个小数据包一次发送,或者大数据包被拆分为多个包,需要多次接收。
所以接收和发送的数据长度不一致是正常的。

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


--------------------编程问答-------------------- 仅供参考,也许你发送方发送的时候接收方正在做其他事情,等接收方开始接受,发送方已经发送完毕,这样的话文件的开头一部分会丢失,你看看是不是。可以让接收方先告诉发送方准备完毕,发送方再发送
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,