在C中使用UDP发送char指针

时间:2010-08-05 16:15:08

标签: c udp

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

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

我能够在UDP服务器端收到field_idfield_length,但指向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 个答案:

答案 0 :(得分:2)

你当然不能在套接字上发送指针 - 摆脱char* field;成员。相反,只需在数据本身附加id和size对。使用writev(2)sendmsg(2)可避免将数据从缓冲区移动到缓冲区。

请注意structure member alignment and padding和号码endianness

答案 1 :(得分:0)

Serialization是你的朋友。

相关链接:

SO-1

SO-2

答案 2 :(得分:0)

将您的结构定义为:

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)应该支持这一点。如果您的编译器不支持零大小的数组,则可以使用单元素字符数组 - 只需记住在计算数据包大小时减去额外的一个字节。