我正在编写一个函数,用于通过套接字发送包含某些数据大小的 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()。
最佳答案
您可以查看 writev
或 sendmsg
,它们允许发送 io-vector,提供分散/聚集的概念。
使用网络应用程序通常会面临将一些缓冲区一起发送(适应协议(protocol))的情况。如果有很多小缓冲区(例如 char、int、long 元素,所以复制并不昂贵),我通常将它们聚合到一个大缓冲区中。如果您有一些更大的缓冲区需要发送,使用分散/收集更好,因为它确实需要进行内存复制(因此称为零复制)。
sendmsg
比 writev
高级一点,它接受一些 TCP/IP 选项。
此外,如果您的缓冲区是一个文件,您可以使用 sendfile
,它使用 DMA 来避免额外的内存复制。
关于c - 如何通过 C 中的套接字将两个缓冲区一起发送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23975975/