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

如何通过C中的套接字一起发送两个缓冲区?,c,arrays,sockets,C,Arrays,Sockets,我正在编写一个函数,用于通过套接字发送包含某些数据大小的头,后跟数据本身send()接受一个指针和一个大小,并从该指针读取/发送。我想使用一个函数,它接受两个指针和两个大小,从第一个指针读取/发送数据,然后在到达第一个指针的末尾后切换到第二个指针。这样,我就能够在有效负载数据之前发送报头,而无需对系统网络堆栈进行额外调用或通过网络复制内存 这是我目前的功能。我必须使用一个额外的发送循环才能首先发送标头: int send_size(int socket, uint8_t* buf, size_t

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

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

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;
}
int send_size(int socket,uint8_t*buf,size_t len){
如果(!buf)返回无效的_输入;
uint8_t头[4];
对于(int i=0;i len){//发送头。
发送=发送(套接字、头、字节剩余-len、SO_NOSIGPIPE);
如果(发送==-1)返回网络错误;
字节剩余-=已发送;
}
而(byteslaining>len){//发送有效负载。
发送=发送(套接字、buf、字节剩余、SO_NOSIGPIPE);
如果(发送==-1)返回网络错误;
字节剩余-=已发送;
}
返回无错误;
}

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

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

你需要创建第三个数组,由两个原始数组组成并发送给它。答案是正确的,这正是OP所需要的,但我不想在没有更多实质内容的情况下对其进行升级。是的,writev正是我想要的。上的手册页有一个很好的示例。