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

C++Builder 檔案任意分割傳輸:Socket 斷點續傳、客戶端分塊發送、伺服端重組

     編輯:VC 教學

架構

  • 單一程式雙角色:按鈕切換「發送端」/「接收端」。
  • `TClientSocket` (Port 8888) 發送、`TServerSocket` 接收。
  • 傳輸 2MB BMP 圖片驗證。

關鍵變數


static int shi=0, emod=0, hui=0, x=0, a=0, i=0; // 狀態機變數
AnsiString filename;
TMemoryStream *pms = new TMemoryStream(); // 接收緩衝
void *z[20000]; // 20KB 收發緩衝

發送端邏輯 (ClientSocket 連線後)

  1. 開啟檔案,`FileSeek` 取得大小,計算分塊數、最後一塊大小 (`emod`)。
  2. 每次 `ClientSocket->Socket->SendBuf` 發送 20KB (或最後 `emod` bytes)。
  3. 發送後 `ClientSocket->Active=false` 斷線,等待網路恢復 → `Active=true` 重連 → 續傳下一塊 (需協議協商斷點位置,此處簡化為每塊重連)。

接收端邏輯 (ServerSocket OnClientRead)


void __fastcall TForm1::ServerClientRead(TObject *Sender, TCustomWinSocket *Socket)
{
    if (shi != 1) { // 非最後一塊
        Socket->ReceiveBuf(z, 20000);
        pms->Position = a;
        pms->WriteBuffer(z, 20000);
        a += 20000;
        // 觸發發送端重連發送下一塊
        ClientSocket->Active = false;
        ClientSocket->Port = 8888;
        ClientSocket->Active = true;
    } else { // 最後一塊
        pms->WriteBuffer(z, emod);
        pms->SaveToFile("d:\\k.bmp");
        pms->Position = 0;
        Image1->Picture->Bitmap->LoadFromStream(pms); // 顯示驗證
        Label1->Caption = "successful";
    }
}

缺憾與改進

  • 狀態機變數全域 static,耦合度高,建議封裝為類別。
  • 「每塊斷線重連」效率極低,實務應單一連線持續傳輸,應用層協議帶 `序號/偏移/總長`,支援 `斷點續傳` (伺服端記錄已收位移,重連時告知從何處續傳)。
  • 無錯誤處理、無完整性校驗、無加密。

本文展示核心思想:客戶端主動分塊、伺服端 `TMemoryStream` 累積重組、斷點記錄 (`a`)、最後塊特殊處理。

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