合并多段数据一次性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的内容合并,然后一次性的发送

浙公网安备 33010602011771号