最近需要做一个局域网内批量传送文件功能  由于首次接触SOCKET 参考网上范例 做了一个简单的传送文件功能  但现在传送文件以后发现 会少文件 比如 一次传送 20个文件 发现只有10几个  如何能保证文件传输正确呢  以下是我的程序 发送端
 private void StartSend()
        {
            //在指定目录及子目录下查找文件
            try
            {
                List<DicFile> listFile = GetFiles();
                if (listFile.Count == 0)
                {
                    return;
                }
                for (int i = 0; i < listFile.Count; i++)
                {
                    FileInfo EzoneFile = new FileInfo(textBox1.Text.Trim()+"/"+listFile[i].strFileName);
                    string strDate = EzoneFile.Name.Substring(0, 14);
                    string strName = EzoneFile.Name.Substring(14, listFile[i].strFileName.Length - 18);
                    if (!checkXml(strName, strDate))
                    {
                        continue;
                    }
                    //打开文件流   
                    FileStream EzoneStream = EzoneFile.OpenRead();
                    //包的大小   
                    int PacketSize = 50000;
                    //包的数量   
                    int PacketCount = (int)(EzoneStream.Length / ((long)PacketSize));
                    //最后一个包的大小   
                    int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount)));
                    //指向远程服务端节点   
                    IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(txtIP.Text.Trim()), int.Parse(this.textBox5.Text));
                    //创建套接字   
                    Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    //连接到发送端   
                    client.Connect(ipep);
                    //获得客户端节点对象   
                    IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
                    //发送[文件名]到客户端   
                    TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(EzoneFile.Name));
                    byte[] data = new byte[PacketSize];
                    //开始循环发送数据包   
                    for (int j = 0; j < PacketCount; j++)
                    {
                        //从文件流读取数据并填充数据包   
                        EzoneStream.Read(data, 0, data.Length);
                        //发送数据包   
                        TransferFiles.SendVarData(client, data);
                    }                    //如果还有多余的数据包,则应该发送完毕!   
                    if (LastDataPacket != 0)
                    {
                        data = new byte[LastDataPacket];
                        EzoneStream.Read(data, 0, data.Length);
                        TransferFiles.SendVarData(client, data);
                    }                    //关闭套接字   
                    client.Close();
                    //关闭文件流   
                    EzoneStream.Close();
                    WriteInfo(strName, strDate);
                    //EzoneFile.MoveTo(textBox1.Text.Trim()+"\\"+EzoneFile.Name.Substring(0,EzoneFile.Name.IndexOf('.'))+"Y.xml");
                } 
                strMessage = "文件传输成功";
                this.BeginInvoke(new UIConSet(SetEnd));
            }
catch (Exception e)
            {
                
                strMessage = e.Message;
                this.BeginInvoke(new UIConSet(SetEnd));
            }          
        }接收端 
 private void Form1_Load(object sender, EventArgs e)
        {
            //StartReceive();
            //开启接收线程   
            TempThread = new Thread(new ThreadStart(this.StartReceive));
            TempThread.Start();
                     }        #region 功能函数        private void StartReceive()
        {
            //创建一个网络端点   
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse("1005"));            //MessageBox.Show(IPAddress.Any);               //创建一个套接字   
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            //绑定套接字到端口   
            server.Bind(ipep);            //开始侦听(并堵塞该线程)   
            server.Listen(10);            while (true)
            {                try
                {
                    ClientSocket = server.Accept();
                    //ClientSocket = client;
                    TempThread1 = new Thread(new ThreadStart(this.Create));
                    TempThread1.Start(); 
                }
                catch (Exception ex)
                {
                    int k = 0;
                }
            }        }
        #endregion          public void Create()
        {
            if (!string.IsNullOrEmpty(txtPath.Text.Trim()))
            {
                //Socket client = ClientSocket;
                //确认连接   
                //Socket client = server.Accept();
                //获得客户端节点对象   
                IPEndPoint clientep = (IPEndPoint)ClientSocket.RemoteEndPoint;
                //获得[文件名]   
                string SendFileName = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(ClientSocket));
                //创建一个新文件   
                if (!string.IsNullOrEmpty(SendFileName))
                {
                    
                    try
                    {
                         FileStream MyFileStream = new FileStream(txtPath.Text.Trim() + "/" + SendFileName, FileMode.Create, FileAccess.Write);
                   
                        //已发送包的个数   
                        int SendedCount = 0;
                        while (true)
                        {                            byte[] data = TransferFiles.ReceiveVarData(ClientSocket);
                            if (data.Length == 0)
                            {
                                break;
                            }
                            else
                            {
                                SendedCount++;
                                //将接收到的数据包写入到文件流对象   
                                MyFileStream.Write(data, 0, data.Length);
                                //显示已发送包的个数     
                            }
                        }
                        //关闭文件流   
                        MyFileStream.Close();
                        //关闭套接字   
                        //ClientSocket.Close();
                    }
                    catch (Exception)
                    {
                    }
                }
            }
        }