序列化和反序列化结构以通过UDP套接字

时间:2015-11-20 17:42:35

标签: c struct

我正在尝试将以下结构序列化为字符串,然后使用UDP sendto方法通过网络流发送它。随后在接收端我想反序列化字符串并重新构造结构。

这是结构定义。

typedef struct PATH{
    int server1;
    int server2;
    int weight;
}PATH;

这是序列化方法

char* serialize(PATH** arr, int sz){

    char* buffer = (50, sizeof(int));

    for (int i = 0; i < sz ; ++i)
    {
        &buffer+= arr[i]->server1:
        &buffer+= arr[i]->server2;
        &buffer+= arr[i]->weight;

    }
    buffer+='\n';

    return buffer;

}

我最终得到的错误是

src/message.c:5:11: warning: incompatible integer to pointer conversion initializing 'char *' with an expression of type 'unsigned long' [-Wint-conversion]
    char* buffer = (50, sizeof(int));
          ^        ~~~~~~~~~~~~~~~~~
src/message.c:9:13: error: expression is not assignable
        &buffer+= arr[i]->server1:
        ~~~~~~~^
src/message.c:11:13: error: expression is not assignable
        &buffer+= arr[i]->weight;
        ~~~~~~~^

我做错了什么?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您没有使用正确的语法动态分配内存;看起来你打算打电话给calloc,但遗漏了这个功能。

您不能使用+=分配地址并增加变量,您需要使用间接。您还需要保存原始buffer地址,并增加一个不同的变量,这样您就可以在结束时返回缓冲区的开头。并且在迭代期间使用的指针需要为int*,这样它将以int的大小逐步通过缓冲区,而不是单个字符。

char* serialize(PATH** arr, int sz){

    char* buffer = calloc(50, sizeof(int));
    int *p = (int*)buffer;

    for (int i = 0; i < sz ; ++i)
    {
        *(p++) = arr[i]->server1:
        *(p++) = arr[i]->server2;
        *(p++) = arr[i]->weight;

    }
    *(p++) = '\n';

    return buffer;
}

请注意,这只是发送整数的二进制表示,而不是将它们转换为字符串。在二进制协议中使用换行符分隔符似乎很奇怪 - 首先发送sz可能会更好,然后接收者可以简单地使用for循环来读取多次重复。< / p>

要处理字节序问题,您可能应该在发送数据时调用htonl(),并在接收时调用ntohl()。例如。序列化应该做:

$(p++) = htonl(arr[i]->server1);

等等。