序列化目录树以通过TCP

时间:2016-02-05 21:00:08

标签: c recursion tcp tree

我正在通过TCP向客户端应用程序发送一个污垢。 Dir节点是一个如下所示的结构:

struct node {
      char *name;
      int count_subnodes;
      struct node **subnodes;
 };

序列化:

void serialize(void *buffer, struct node *n, int *c){
    int i;
    if(!n)
        return;
    memcpy(buffer+(*c), n, sizeof(*n));
    *c+=sizeof(n);
    for(i = 0; i < n->count_subnodes; i++){
        serialize(buffer, n->subnode[i], c);
    }
}

我做错了什么?当我为子节点递归调用serialize时,会出现段错误。另外,我是否需要任何类型的划界标记,以便我可以在客户端重建树?

编辑:c是保持缓冲区中当前位置的计数。

编辑2:错字。它的大小是(* n)而不是c。遗憾

2 个答案:

答案 0 :(得分:1)

  1. 你怎么知道你的缓冲区足够大?

  2. sizeof(n)将给出指针的大小,而不是结构;使用sizeof(*n)

  3. 检查n->subnode[i]不是NULL

答案 1 :(得分:-1)

您正在复制struct n,并为其提供size c,即int*。我认为你的问题在于这一行:

memcpy(buffer+(*c), n, sizeof(c));

另外,你真的不想序列化结构本身。如果你这样做,那么当你真的想要发送这个名字时,你就会发送一个指向这个名字的指针。

我认为您需要序列化name以及子节点计数。也许是这样的:

int name_length = strlen(n->name + 1); /* +1 for null terminator. */
memcpy(buffer+(*c), n->name, name_length);
*c += name_length;
memcpy(buffer+(*c), &n->count_subnodes, sizeof(n->count_subnodes));
*c += sizeof(n->count_subnodes);

请记住,在为不同系统序列化二进制数据时,可能会遇到endianness个问题。

确保您将buffer分配得足够大。超越buffer肯定会出现段错误。它也可能与您最初调用serialize的方式有关。您还需要确保您的node树有效且没有悬空指针。您必须为int*传递有效的c

您可能希望发布调用代码的最小示例。