我尝试通过TCP发送和接收数据。我的问题是我想在一个TCP消息中发送2个结构,有没有办法将结构链接在一起。 类似的东西:
send(connected, struct1 + struct2, sizeof(struct1 + struct2), 0);
recv_data = recv(connected, struct1 + struct2,sizeof( struct1 + struct2),0);
如果不可以,可以在消息的开头添加一个信号字节,如:
send(connected, "0x01" + struct1, sizeof(struct1 + 1), 0);
recv_data = recv(connected, struct1,sizeof(struct1),0);
答案 0 :(得分:0)
您可以查看writev
和readv
函数,这些函数允许发送/接收具有多个非连续内存位置的数据。
struct iovec data[2];
data[0].iov_base = vector1.data();
data[0].iov_len = vector1.length() * sizeof(vector1[0]);
data[1].iov_base = vector2.data();
data[1].iov_len = vector2.length() * sizeof(vector2[0]);
writev(socket, data, 2);
然而,在接收方,您需要一些方法来了解传入元素的数量,以便您可以预留足够的空间来阅读。
这也适用于可复制对象的矢量,而不是像std::vector<std::string>
那样。
您确实需要定义某种正确设计的序列化格式,而不仅仅是将原始字节从向量复制到套接字。
如果您不知道如何正确地执行此操作(并且您的伪代码建议您不这样做),那么请查看类似Protocol Buffers的内容。
编辑:好吧,你不是在谈论矢量,尽管反复说“矢量”。对于简单类型的简单结构,您可以这样做:
struct iovec data[2];
data[0].iov_base = &struct1;
data[0].iov_len = sizeof(struct1);
data[1].iov_base = &struct2;
data[1].iov_len = sizeof(struct2);
writev(socket, data, 2);
但是仍然不应该只是将原始字节复制到套接字/从套接字复制。这仅在发送和接收机器就数据类型的大小,对齐和字节顺序达成一致时才有效。使用像Protocol Buffers这样设计合理的序列化系统仍然更安全,更正确。这是由了解如何正确和安全地做这些事情的人设计的。