合并多段数据一次性writev

如果有多段数据buffer需要发送,多个buffer拷贝到一个buffer,然后一次性发送,会存在数据拷贝的开销。比如:

vector<char> buffer;
buffer.insert(buffer.end(),buf1.begin(),buf1.end());  //buf1拷贝到buffer后有开销
buffer.append(buffer.end(),buf2.begin(),buf2.end());
send(sockfd,buffer,len_buffer,0);

Linux提供了writev函数,可以一次性发送多段内存数据而不需要拷贝。

ssize_t writev(int fd,const struct iovec* iov, int iovcnt);

struct iovec
{
  void* iov_base;  //buffer起始地址
  size_t iov_len;  //buffer内需要发送的字节数
}
struct iovec iov[2];  //定义个iovec数组
iov[0].iov_base = buffer1;
iov[0].iov_len = buffer1_len;
iov[1].iov_base = buffer2;
iov[1].iov_len = buffer2_len;

writev(sockfd, iov, 2);  //内核中会将buffer1和buffer2的内容合并,然后一次性的发送
posted @ 2025-12-03 15:32  仰望星河Leon  阅读(4)  评论(0)    收藏  举报