鍍金池/ 問答/Linux  網絡安全/ linux下tcp編程,客戶端給服務端傳文件,服務端如何判斷文件傳輸結束?

linux下tcp編程,客戶端給服務端傳文件,服務端如何判斷文件傳輸結束?

如題,我的想法是客戶端在把文件傳完后,再傳一段字符串作為特殊標志,告訴服務端已經傳送完畢,這就意味著服務端那邊讀到數據就得判斷一下是不是這個特殊標志。

想法比較簡單暴力,剛接觸這方面,希望各位老手能給一個正確的解決方案,提示一下。

回答
編輯回答
墨染殤

你看http 協(xié)議有一個 content-length,實際上,你自己傳文件也最好定義一個簡單的協(xié)議比如


contentlength,content;

一般解碼有基于長度的,也有基于分隔符的,看你自己怎么選

2018年5月29日 12:53
編輯回答
懶豬

你需要一個協(xié)議,用現成的或自己實現一種都可以。

參考例子

傳輸的文件內容可以用數據包表示,像這樣

// 注意:你需要設置結構字段對齊。
struct Packet {
    uint32_t file_size;
    uint8_t  file_content[];
}
__attribute__((aligned(4), packed));

客戶端根據需要傳輸的文件,構造并發(fā)送一個數據包

// 讀取文件內容及大小
// file_content = ...
// file_size = ... 

// 構造數據包
struct Packet *p = (struct Packet*) malloc(sizeof(struct Packet) + file_size);
p->file_size = file_size;
memcpy(p->file_content, file_content, file_size);

// 連接服務器
// int client = socket(...);
// connect(...);
// 發(fā)送數據包
send(client, p, sizeof(struct Packet) + file_size), 0);

// ...

而服務端讀取包頭便知文件大小,如

// int client = accept(...)
// int size = recv(client, buffer, ...)
if (size >= sizeof(struct Packet)) {
    // 已經收到數據包頭
    struct Packet *p = (struct Packet*) buffer;
    uint32_t file_size = p->file_size;
    // 繼續(xù)接收剩余的數據,直到整個完整的數據包。
    // ...
}
2017年9月14日 18:39