gpt4 book ai didi

c - 如何通过 C 中的套接字将两个缓冲区一起发送?

转载 作者:太空宇宙 更新时间:2023-11-04 02:03:14 24 4
gpt4 key购买 nike

我正在编写一个函数,用于通过套接字发送包含某些数据大小的 header ,然后是数据本身。 send() 接受一个指针和一个大小,并从该指针读取/发送。我想使用一个函数,它接受两个指针和两个大小,并从第一个指针读取/发送,然后在到达第一个指针的末尾时切换到第二个指针。这样,我就可以在有效负载数据之前发送 header ,而无需额外调用系统网络堆栈或复制内存。

这是我目前的功能。我必须使用一个额外的发送循环来首先发送 header :

int send_size(int socket, uint8_t* buf, size_t len){
if (!buf) return INVALID_INPUT;
uint8_t header[4];
for (int i = 0; i<4; i++){ // Put size of data into 4-byte header, little endian.
header[i] = len%256;
len = len/256;
}
size_t bytesRemaining = len + 4;
size_t sent;
while (bytesRemaining > len){ // Send header.
sent = send(socket, header, bytesRemaining - len, SO_NOSIGPIPE);
if (sent==-1) return NETWORK_ERROR;
bytesRemaining -= sent;
}
while (bytesRemaining > len){ // Send payload.
sent = send(socket, buf, bytesRemaining, SO_NOSIGPIPE);
if (sent==-1) return NETWORK_ERROR;
bytesRemaining -= sent;
}
return NO_ERROR;
}

我宁愿有一个发送循环告诉我的系统一起发送两个数组,这样我就不必经常调用 send()。

最佳答案

您可以查看 writevsendmsg,它们允许发送 io-vector,提供分散/聚集的概念。
使用网络应用程序通常会面临将一些缓冲区一起发送(适应协议(protocol))的情况。如果有很多小缓冲区(例如 char、int、long 元素,所以复制并不昂贵),我通常将它们聚合到一个大缓冲区中。如果您有一些更大的缓冲区需要发送,使用分散/收集更好,因为它确实需要进行内存复制(因此称为零复制)。
sendmsgwritev 高级一点,它接受一些 TCP/IP 选项。此外,如果您的缓冲区是一个文件,您可以使用 sendfile,它使用 DMA 来避免额外的内存复制。

关于c - 如何通过 C 中的套接字将两个缓冲区一起发送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23975975/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com