linux下tcp编程,客户端给服务端传文件,服务端如何判断文件传输结束?

如题,我的想法是客户端在把文件传完后,再传一段字符串作为特殊标志,告诉服务端已经传送完毕,这就意味着服务端那边读到数据就得判断一下是不是这个特殊标志。

想法比较简单暴力,刚接触这方面,希望各位老手能给一个正确的解决方案,提示一下。

阅读 2.8k
2 个回答

你需要一个协议,用现成的或自己实现一种都可以。

参考例子

传输的文件内容可以用数据包表示,像这样

// 注意:你需要设置结构字段对齐。
struct Packet {
    uint32_t file_size;
    uint8_t  file_content[];
}
__attribute__((aligned(4), packed));

客户端根据需要传输的文件,构造并发送一个数据包

// 读取文件内容及大小
// 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(...);
// 发送数据包
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;
    // 继续接收剩余的数据,直到整个完整的数据包。
    // ...
}

你看http 协议有一个 content-length,实际上,你自己传文件也最好定义一个简单的协议比如


contentlength,content;

一般解码有基于长度的,也有基于分隔符的,看你自己怎么选

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题