代码之家  ›  专栏  ›  技术社区  ›  Trevor

在C语言中用UDP发送字符指针

udp c
  •  1
  • Trevor  · 技术社区  · 16 年前

    我有一个要发送到UDP套接字的结构:

    typedef struct
    {
        char field_id;
        short field_length;
        char* field;
    } field_t, *field_p;
    

    field_id field_length 但是,一旦在UDP服务器端接收到 field 按预期无效。

    正确发送和接收动态字符*的最佳方法是什么?

    memcpy 在客户端:

    char* data = 
        (char*)malloc(sizeof(field_t) + (sizeof(char) *  strlen(my_field->field)));
    memcpy(data, my_field, sizeof(field_t));
    memcpy(data+sizeof(field_t), my_field->field, strlen(my_field->field) + 1);
    

    在服务器端:

    field_p data = (field_p)buffer;
    field_string = (char*)buffer+sizeof(field_t);
    

    谢谢。

    3 回复  |  直到 16 年前
        1
  •  2
  •   Nikolai Fetissov    16 年前

    当然,您不能将指针发送到套接字上—请除去 char* field; 成员。相反,只需将id和size对附加到数据本身。使用 writev(2) sendmsg(2) 避免在缓冲区之间移动数据。

    structure member alignment and padding 和编号 endianness .

        2
  •  0
  •   Community Mohan Dere    9 年前

    Serialization 他是你的朋友。

    相关链接:

    SO-1

    SO-2

        3
  •  0
  •   el.pescado - нет войне    16 年前

    typedef struct
    {
        uint8_t  field_id;
        uint16_t field_length;
        char     field[0]; // note: in C99 you could use char field[];
    } field_t, *field_p;
    

    然后,文本缓冲区将立即跟随您的结构。只需记住一些技巧:

    // initialize structure
    field_t *
    field_init (uint8_t id, uint16_t len, const char *txt)
    {
        field_t *f = malloc (sizeof (field_t + len)); // note "+ len";
        f->field_id  = id;
        f->field_length = len;
        memcpy (f->field, txt, len);
        return f;
    }
    
    // send structure
    int
    field_send (field_t *f, int fd)
    {
        return write (fd, f, sizeof (*f) + f->field_length); // note "+ f->field_length"
    }
    

    不过,我觉得这不是标准。但是,大多数编译器(GCC&&MSVC)应该支持这一点。如果您的编译器不支持零大小的数组,您可以使用一个元素字符数组-只要记住在计算数据包大小时减去额外的一个字节。