TCP 设计成 "流", 只是实现起来容易一些吧, 但用起来真不爽 实际上程序里用到的都是一块一块的内存, TCP 强行弄出一个"流"来. 这样在接收方必然要从 "流" 转换成 "块", 转换的方式有: 固定长度, 加包头指定长度, 用特殊的间隔标记.
固定长度: 简单无开销, 但是太死板不灵活, 适用场合很少. 加包头指定长度: 编程简单, 但会多一次读取开销. 用特殊的间隔标记: 比如 HTTP 这种, 就需要遍历全部内容
如果 TCP 原本就保留“块”信息, 则使用起来就会简单很多了。 比如这样定义
struct iovec {
void *iov_base;
size_t iov_len;
};
/*
返回发送出去的 struct iovec 的个数, 不要发送半个
出错的情况的返回值和 write()/send() 一样
*/
int my_writev(int fd, struct iovec *vec, size_t n_vec);
/*
返回接收到的 struct iovec 的个数, 不要接收半个
出错的情况的返回值和 read()/recv() 一样
接收的时候可以把 struct iovec *vec 预先分配,也可以不分配直接接收到 buf 里面同时把分块信息保存到 struct iovec *vec。
*/
int my_readv(int fd, struct iovec *vec, size_t n_vec, void *buf, size_t size_of_buf);
这样用来起来再很多场合就非常方便了。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.