我有一个结构,我发送到UDP套接字:
typedef struct
{
char field_id;
short field_length;
char* field;
} field_t, *field_p;
我能够在UDP服务器端收到field_id
和field_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);
是否有更简洁的方法可以做到这一点,还是这是唯一的方法?
感谢。
答案 0 :(得分:2)
你当然不能在套接字上发送指针 - 摆脱char* field;
成员。相反,只需在数据本身附加id和size对。使用writev(2)
或sendmsg(2)
可避免将数据从缓冲区移动到缓冲区。
答案 1 :(得分:0)
答案 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)应该支持这一点。如果您的编译器不支持零大小的数组,则可以使用单元素字符数组 - 只需记住在计算数据包大小时减去额外的一个字节。