我做成的是只可以在内网进行点对点传送文件的,现在有几点很迷惑的问题。第一是不知道要如何才能支持外网点对点进行传送。第二是如果有好几台机器都运行了接收端,那我怎么去区分他们,然后将文件只发给一个指定的接收端。下面是我在网上找到的代码:
//*******************************************发送端*********************************************
 private void StartSend()
        {
            //创建一个文件对象
            FileInfo EzoneFile = new FileInfo(this.textBox1.Text);
            //打开文件流 
            FileStream EzoneStream = EzoneFile.OpenRead();
            //包的大小  
            int PacketSize = int.Parse(this.txtFileSize2.Text);
            //包的数量  
            int PacketCount = (int)(EzoneStream.Length / ((long)PacketSize));
            this.txtFileCount.Text = PacketCount.ToString();
            this.progressBar1.Maximum = PacketCount;
            //最后一个包的大小  
            int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount)));
            this.txtLastFileSize.Text = LastDataPacket.ToString();
            ////创建一个网络端点   
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse(this.txtPort.Text));
            ////创建一个套接字
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            ////绑定套接字到端口  
            server.Bind(ipep);
            ////开始侦听(并堵塞该线程) 
            server.Listen(10);
            //确认连接   
            Socket client = server.Accept();
            //获得客户端节点对象  
            IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
            //获得客户端的IP地址
            this.txtReceiveIP.Text = clientep.Address.ToString();
            //发送[文件名]到客户端  
            CommonModule.EzoneModule.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(EzoneFile.Name));
            //发送[包的大小]到客户端 
            CommonModule.EzoneModule.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketSize.ToString()));
            //发送[包的总数量]到客户端  
            CommonModule.EzoneModule.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketCount.ToString()));
            //发送[最后一个包的大小]到客户端   
            CommonModule.EzoneModule.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(LastDataPacket.ToString()));            //数据包   
            byte[] data = new byte[PacketSize];
            //开始循环发送数据包 
            for (int i = 0; i < PacketCount; i++)
            {
                //从文件流读取数据并填充数据包  
                EzoneStream.Read(data, 0, data.Length);
                //发送数据包 
                CommonModule.EzoneModule.SendVarData(client, data);
                //显示发送数据包的个数 
                this.txtHasSendCount.Text = ((int)(i + 1)).ToString();
                //进度条值的显示  
                this.progressBar1.PerformStep();
            }            //如果还有多余的数据包,则应该发送完毕!
            if (LastDataPacket != 0)
            {
                data = new byte[LastDataPacket];
                EzoneStream.Read(data, 0, data.Length);
                CommonModule.EzoneModule.SendVarData(client, data);
                this.progressBar1.Value = this.progressBar1.Maximum;
            }            //关闭套接字   
            client.Close();
            server.Close();
            //关闭文件流   
            EzoneStream.Close();
            this.btnSend.Enabled = true;
            MessageBox.Show("文件傳送完毕!");
        }
//*******************************************接收端*********************************************
private void StartReceive()
        {
            //创建一个网络端点 
            IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(this.TxtServerIP.Text), int.Parse(this.TxtPort.Text));
            //创建一个套接字 
            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //開始连接  
            client.Connect(ipep);
            //获得[文件名] 
            string SendFileName = System.Text.Encoding.Unicode.GetString(CommonModule.EzoneModule.ReceiveVarData(client));
            this.txtFileName.Text = SendFileName;
            //包的大小
            this.txtFileSize.Text = System.Text.Encoding.Unicode.GetString(CommonModule.EzoneModule.ReceiveVarData(client));
            //包的大小
            this.txtFileCount.Text = System.Text.Encoding.Unicode.GetString(CommonModule.EzoneModule.ReceiveVarData(client));
            this.progressBar1.Maximum = int.Parse(this.txtFileCount.Text);
            //最後一個包的大小
            this.txtLastFileSize.Text = System.Text.Encoding.Unicode.GetString(CommonModule.EzoneModule.ReceiveVarData(client));
            //创建一个新文件 
            FileStream MyFileStream = new FileStream(SendFileName, FileMode.Create, FileAccess.Write);
            //已发送包的个数
            int SendedCount = 0;
            while (true)
            {
                byte[] data = CommonModule.EzoneModule.ReceiveVarData(client);
                if (data.Length == 0)
                {
                    break;
                }
                else
                {
                    SendedCount++;
                    //将接收到的数据包写入到文件流对象
                    MyFileStream.Write(data, 0, data.Length);
                    //顯示已發送包大小
                    this.txtHasSendCount.Text = SendedCount.ToString();
                    //顯示接收進度
                    this.progressBar1.PerformStep();
                }
            }
            this.progressBar1.Value = this.progressBar1.Maximum;
            //關閉文件流
            MyFileStream.Close();
            //關閉Socket
            client.Close();
            this.btnReceive.Enabled = true;
            MessageBox.Show("接收完畢!");
        }