首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 開發簡單 P2B 應用:基於 TCP 的文件共享原理與實現

     編輯:關於C語言

P2P 網絡架構

典型 P2P 包含中央索引服務器(不存文件,只存用戶信息、IP、共享文件列表)與多個客戶端。流程:

  1. 客戶端登錄索引服務器
  2. 注冊共享文件
  3. 搜索文件 → 服務器返回提供者 IP 列表
  4. 客戶端直連下載
  5. 下載完成後向索引服務器注冊新副本

C# 核心類:TcpListener 與 TcpClient

.NET 內置 TcpListener (服務端) 和 TcpClient (客戶端) 讓 P2P 開發極簡。

服務端:監聽並發送文件


public class Transfer
{
    private TcpListener _listener;
    private int _port = 8081;

    public Transfer()
    {
        _listener = new TcpListener(IPAddress.Any, _port);
    }

    public void ListenForPeers()
    {
        _listener.Start();
        while (true)
        {
            using (Socket socket = _listener.AcceptSocket())
            using (NetworkStream stream = new NetworkStream(socket))
            {
                // 讀取請求文件名 (256 bytes)
                byte[] buffer = new byte[256];
                stream.Read(buffer, 0, buffer.Length);
                string filename = Encoding.ASCII.GetString(buffer).TrimEnd('\0');
                filename = filename.Replace("/", "\\"); // 路徑標準化

                // 發送文件
                using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
                using (BinaryReader br = new BinaryReader(fs))
                {
                    byte[] fileBuffer = new byte[1024];
                    int read;
                    while ((read = br.Read(fileBuffer, 0, fileBuffer.Length)) > 0)
                        stream.Write(fileBuffer, 0, read);
                }
            }
        }
    }
}

客戶端:連接下載文件


public void DownloadToClient(string serverIp, string remoteFilename, string localFilename)
{
    using (TcpClient client = new TcpClient())
    {
        client.Connect(serverIp, _port);
        using (NetworkStream stream = client.GetStream())
        {
            // 發送文件名
            byte[] nameBytes = Encoding.ASCII.GetBytes(remoteFilename);
            stream.Write(nameBytes, 0, nameBytes.Length);

            // 接收文件
            using (FileStream fs = new FileStream(localFilename, FileMode.Create))
            using (BinaryWriter bw = new BinaryWriter(fs))
            {
                byte[] buffer = new byte[1024];
                int bytesRead;
                while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
                    bw.Write(buffer, 0, bytesRead);
            }
        }
    }
}

關鍵技術點

技術說明
TcpListener服務端綁定端口,AcceptSocket 阻塞等待連接
NetworkStream基於 Socket 的流式讀寫,簡化字節傳輸
BinaryReader/Writer高效二進制塊讀寫
using 語句確保 Socket、Stream、File 等非托管資源及時釋放

擴展方向

  • 多線程/異步 (BeginAcceptSocket/Task.Run) 支持並發
  • 斷點續傳:協議增加文件偏移量、長度字段
  • 文件完整性校驗:MD5/SHA256
  • NAT 穿透:STUN/TURN 或 UPnP
  • 索引服務器:單獨項目,維護用戶/文件元數據

安全提示

  • 生產環境必須加入身份認證、授權、傳輸加密 (TLS)
  • 限制共享目錄,防止目錄遍歷攻擊 (..\\)
  • 文件名長度驗證,防緩衝區溢出
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved