C 技術分享 基於socket的斷點續傳功能

2021-07-03 18:41:07 字數 1169 閱讀 8801

最近開發了乙個異地災備傳輸工具,每週從廣州伺服器同步5g大小的資料庫備份檔案到北京伺服器。

第乙個版本的傳輸工具開發得很簡單,兩個window服務,乙個負責傳送,另乙個負責接收,利用socket建立tcp鏈結,在測試伺服器上傳輸10g大小的檔案沒有問題。

但部署到生產環境之後,每次傳輸了3g左右的資料就中斷了,經分析是由於網路不穩定造成的,所以需要對傳輸工具新增斷點續傳功能,當傳輸意外中斷時,可以自動連線,並完成上一次未完成的傳輸。

這實際上是為你的傳輸功能新增了暫停功能,網路中斷的我時候暫停傳輸了,網路恢復之後繼續再傳。

既然搞清楚原理了我們就趕緊開始寫**吧,下面是核心**。

封裝乙個類包含一下字段,用來記錄傳輸的狀態:filename 檔名、filesize 檔案大小、packagesize 資料報的大小、packagecount 傳輸總次數,index 當前傳輸位置。每次傳送資料報時,帶上這些資訊,就算意外中斷了,重新連上了之後,也可以很輕易的判斷傳輸的進度。

public

class breakpointpost

public

long filesize

public

long packagesize

public

int packagecount

public

int index

}

獲取檔案的傳輸次數

private

static

int getfilepackagecount(long filesize, long packagesize)

分塊讀取檔案

private

static

byte fileread(string path, int index, long size)

return result;

}

分塊接受檔案

private

static

void

filewrite(string path, int index, long packagesize, int receivesize, byte data)

}

2、windows服務版(生產版本)

基於C 和TCP的Socket通訊

很長時間沒寫部落格了,希望自己可以堅持下去,從小白開始成長吧,也希望各位讀者能給點鼓勵。本文實現的功能是基於c 和tcp進行服務端客戶端進行通訊,希望給你給讀者一定的幫助。具體步驟 1 初始化scoket 資源,注意,一定要在同一段 中實現,不然可能會出問題。2 構造服務端socket 3 繫結監聽...

mysql可以分享的技術 技術分享 MySQL

1 查詢語句是如何執行的?1 連線 1 建立連線 2 驗證許可權,修改了許可權,建立新的連線才會生效。3 sql執行的臨時記憶體 2 查詢快取 1 先查詢快取,更新操作會導致所有快取失效。2 mysql 8.0功能去掉 3 分析 詞法解析,語法解析 4 優化 1 決定使用哪個索引,比方說根據統計資訊...

如何在C語言中判斷socket是否已經斷開

下面來介紹判斷非阻塞socket是否已經斷開的幾種方法 注意要區分不同作業系統分別進行測試,包括windows,linux和unix會各有不同。在windows下比較簡單,可以使用fd close事件判斷socket是否已經斷開 view plaincopy to clipboardprint?bo...