发送端代码:                                        String TargetIP = file.Target; //接收方IP
                                        IPEndPoint ip = new IPEndPoint(IPAddress.Parse(TargetIP), 19812);
                                        Socket sndSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                                        FileStream fs = new FileStream(file.FilePath + "\\" + file.filename, FileMode.Open);
                                        byte[] SendBytes = new byte[MAX_TRANSFER_BYTES];  //MAX_TRANSFER_BYTES=8192
                                        Int64 offset = 0;
                                        while (offset < fs.Length)
                                        {
                                            int readcount = 0;
                                            if (fs.Length - offset >= SendBytes.Length)
                                            {
                                                readcount = fs.Read(SendBytes, 0, SendBytes.Length);
                                            }
                                            else
                                            {
                                                readcount = fs.Read(SendBytes, 0, (int)(fs.Length - offset));
                                            }
                                            int send = sndSock.SendTo(SendBytes, ip);
                                            Thread.Sleep(2);
                                            offset += readcount;
                                        }
                                        fs.Close();
                                        fs.Dispose();
                                        sndSock.Close();
接收端主要代码                                              while (totalCount < file.filesize)
                                        {
                                            Int32 readCount = RevSocket.ReceiveFrom(Receivebyte, ref SndEndPoint);
                                            fs.Seek(0, SeekOrigin.End);
                                            fs.Write(Receivebyte, 0, readCount);
                                            totalCount += readCount;
                                        }

解决方案 »

  1.   

    你没有确认服务器端是否收到的机制UDP是不保证数据都能传到的
      

  2.   

    控制一下传送的速度
    加入固定的包头,比如包头先发送一个总共多少个包,当前第几个包这样两个数据服务器如果发现缺少或者不连续,可以主动发指令要求客户端重发指定编号的数据包或者每个收到的都返回RESPOSE消息
      

  3.   

    UDP是种不可靠的连接,发送发只管发送它不会顾及接收发是否收到,所以会经常出现丢失数据的现象,这是很正常的,更何况你一次发送那么大的数据,你为它们开辟的缓冲区又有多大,能容下那么大的数据吗
    你可以用TCP来进行有连接的传输或是在发送后加上fs.Flush()方法将缓冲区的数据强制发送出去
      

  4.   

    解决数据丢失问题的最简单的方法就是,设计一种类似于TCP的重传机制的协议,成功发送到远程主机上的数据包能够从远程设备上返回一个确定信息,如果在一定的时间内没有收到来自远程设备的确定信息,将重发原始数据包
      

  5.   

    但是这只是理想化的,因为一但实现了复杂的安全手段,UDP将失去其容量大,传输快速的特点,这是一种对功能与性能之间的取舍