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

标签 c arrays sockets

我正在编写一个函数,用于通过套接字发送包含某些数据大小的 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/

相关文章:

c - Double 到 Float 数组转换和 Endian 交换

c - 如何在C中读写tar文件?

c# - 通过套接字发送图像并将其保存在服务器上

c - 从 C 中的链表中弹出一个元素

c - 数组在 C 程序中被随机覆盖。可能是简单的解决方案

c - 我如何用 C 练习 Unix 编程?

ios - 如何从嵌套 JSON Swift 检索值

mysql - MySQL 中的数组?

Windows 中 UDP 的 C++ 头文件?

C++套接字窗口