0

我有以下结构,我正在尝试通过网络发送到另一个应用程序

 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)

然后发送缓冲区

4

3 回答 3

0

是的,如果您要发送到(可能)在您自己的流程之外的东西,那么这种编组或序列化是唯一可行的方法。

于 2012-12-22T00:16:52.830 回答
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通常,对于像orint或之类的多字节值long long,您必须担心传输的字节顺序。

于 2012-12-22T00:20:36.220 回答
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);在需要形成消息时使用。

这两种方法都有一个缺点,如果你在结构中有“间隙”,你需要在另一端处理它(如果它是用不同的编译器编译的,对于不同的处理器,它可能有不同的间隙规则,或者只是使用不同的编译器开关)

于 2012-12-22T00:33:41.300 回答