我在C中定义了以下结构,我希望使用Berkeley Socket通过 TCP连接在客户端和Linux服务器之间发送它:
struct Argument{
int pid;
int length;
chat op;
char *data;
};
由于我的“char * data”是一个指针,而不是可用于在本地发送机器中分配可变大小的数据,我必须在两个不同的时间将此结构发送到接收方。 第一次,我只发送固定变量,即前三个变量。然后在接收时,我分配一个长度大小的缓冲区来第二次接收数据部分。
所以我的问题是,无论如何只能将这个结构一次发送到具有可变数据字段大小的另一端,而不是我正在做的两倍?
if (write(peer_fd, (struct Argument*) arg, sizeof (struct Argument)) < 0)
{
close(peer_fd);
return -1;
}
非常感谢。
答案 0 :(得分:1)
考虑使用分散 - 聚集读写技术。
wtitev允许您在一次调用中从多个缓冲区(固定大小的标头和char数组)中进行写入。您需要承担单个系统调用的成本,并且内核中的套接字代码将数据组装到单个缓冲区中(如果可能),并进行单个网络调用。