在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Linux  網(wǎng)絡(luò)安全/ linux下tcp編程,客戶端給服務(wù)端傳文件,服務(wù)端如何判斷文件傳輸結(jié)束?

linux下tcp編程,客戶端給服務(wù)端傳文件,服務(wù)端如何判斷文件傳輸結(jié)束?

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

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

回答
編輯回答
墨染殤

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


contentlength,content;

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

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

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

參考例子

傳輸?shù)奈募?nèi)容可以用數(shù)據(jù)包表示,像這樣

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

客戶端根據(jù)需要傳輸?shù)奈募?,?gòu)造并發(fā)送一個數(shù)據(jù)包

// 讀取文件內(nèi)容及大小
// file_content = ...
// file_size = ... 

// 構(gòu)造數(shù)據(jù)包
struct Packet *p = (struct Packet*) malloc(sizeof(struct Packet) + file_size);
p->file_size = file_size;
memcpy(p->file_content, file_content, file_size);

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

// ...

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

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