我有以下结构,我正在尝试通过网络发送到另一个应用程序
struct protocol
{
char protocol;
char field1;
char field2;
char field3;
char field4;
char field5;
char field6;
char field7;
char field8;
char msg_id;
char msg_length;
char *msg;
};
我遇到的问题是我不知道如何通过网络发送这个结构,因为有一个指针指向其中的字符串,而memcpy结构缓冲区将无法工作,如下所示这是唯一的方法吗?
memcpy (buffer, protocol->protocol, char)
memcpy (buffer, protocol->field1, char)
...
memcpy (buffer, protocol->msg, protocol->length)
然后发送缓冲区
答案 0 :(得分:0)
是的,如果你发送的东西(可能是)在你自己的进程之外,那种编组或序列化是唯一可行的方法。
答案 1 :(得分:0)
您需要将结构序列化为某种缓冲区。您的副本序列仅在概念上是正确的;有许多细节需要解决:
char buffer[sizeof(struct protocol) + protocol->msg_length]; // Over-allocation
buffer[0] = protocol->protocol;
buffer[1] = protocol->field1;
...
buffer[8] = protocol->field8;
buffer[9] = protocol->msg_id;
buffer[10] = protocol->msg_len;
memcpy(&buffer[11], protocol->msg, protocol->msg_len);
现在您可以编写要发送的正确长度的缓冲区(11 + protocol->msg_len
)。
这很简单;没有担心的字节序问题。通常,对于short
或int
或long long
等多字节值,您必须担心传输的字节顺序。
答案 2 :(得分:0)
如果你可以限制你发送的数据的某些方面,例如“msg_len永远不会超过X字节”,你可以这样做:
#define MAX_MSG_LEN 1000
struct protocol
{
char protocol;
char field1;
char field2;
char field3;
char field4;
char field5;
char field6;
char field7;
char field8;
char msg_id;
char msg_length;
char msg[MAX_MESSAGE_LEN];
};
您需要计算msg之前的开销,然后使用msg_length来确定需要发送的缓冲区的总大小。
或者,另一种方法是:
struct protocol
{
char protocol;
char field1;
char field2;
char field3;
char field4;
char field5;
char field6;
char field7;
char field8;
char msg_id;
char msg_length;
char msg[1];
};
然后在需要形成消息时使用struct procotol *msg_ptr = malloc(sizeof(struct protocol) + msg_len-1);
。
这两种方法都有缺点,如果你在结构中有“缺口”,你需要在另一端处理它(如果它用不同的编译器编译,可能有不同的间隙规则,对于不同的处理器,或者只是使用不同的编译器开关)