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

CSocket 檔案傳輸:伺服端/客戶端完整代碼(適用小型檔案)

     編輯:關於VC++

架構說明

阻塞式 TCP 連線,伺服端主動發送整個檔案,客戶端接收存檔。不適用大檔案(記憶體一次讀取全檔)。

伺服端發送

void SendFile() {
    AfxSocketInit(nullptr);
    CSocket srvSock, cliSock;
    srvSock.Create(34000);
    srvSock.Listen();
    srvSock.Accept(cliSock); // 阻塞等待連線

    CFile file(L"C:\\ANYFILE.EXE", CFile::modeRead | CFile::typeBinary);
    int len = file.GetLength();
    cliSock.Send(&len, 4); // 先傳 4 位元組檔案長度

    BYTE* buf = new BYTE[len];
    file.Read(buf, len);
    cliSock.Send(buf, len); // 傳送檔案內容
    delete[] buf;
    file.Close();
    cliSock.Close();
}

客戶端接收

void GetFile() {
    AfxSocketInit(nullptr);
    CSocket cliSock;
    cliSock.Create();
    cliSock.Connect(L"127.0.0.1", 34000);

    int len;
    cliSock.Receive(&len, 4); // 讀取檔案長度

    BYTE* buf = new BYTE[len];
    cliSock.Receive(buf, len); // 接收檔案內容

    CFile file(L"C:\\temp\\ANYFILE.EXE",
        CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
    file.Write(buf, len);
    delete[] buf;
    file.Close();
    cliSock.Close();
}

關鍵限制與改進方向

  • 大檔案會耗盡記憶體 → 改用分塊讀寫(如 64KB 緩衝區循環)
  • 無斷點續傳 → 需協議擴充:支援 SEEK、RESUME 指令
  • 單執行緒阻塞 → 實際專案應用 CAsyncSocket 或執行緒池

本範例適合教學、小型設定檔/腳本傳輸等輕量場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved