带有send的结构内部的指针

时间:2012-12-22 00:07:46

标签: c pointers struct

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

 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)

然后发送缓冲区

3 个答案:

答案 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)。

这很简单;没有担心的字节序问题。通常,对于shortintlong 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);

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