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

发布于 2022-09-07 07:43:47 字数 131 浏览 10 评论 0

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

叹梦 2022-09-14 07:43:47

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

参考例子

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

// 注意:你需要设置结构字段对齐。
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;
    // 继续接收剩余的数据,直到整个完整的数据包。
    // ...
}
梦途 2022-09-14 07:43:47

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


contentlength,content;

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文