我有一个在我的互联网应用程序中使用的结构,如下所示:
struct query {
ushort trans_id;
ushort flags;
ushort opcode;
ushort content_length;
char content[512];
};
基本上,我只是试图采用这种结构并将其转换为要发送的“数据包”。它必须具有相应的长度和一切。所以;如果我能,我会喜欢: struct query q;
q.trans_id = 0x5544;
q.flags = 0x0000;
q.opcode = 0x0010;
q.content_length = 0x0001;
q.content[0] = '\0'; //I would want my packet to end up looking like this, when outputted to the socket:
//\x55\x44\x00\x00\x00\x10\x00\x01\x00
//and yes, it's going to be stored in a char buffer, but I'm not using any functions that will trim off any of the things past the null!
我觉得这是一个相对简单的问题,可以通过投射我的数据类型来回答,但我认为它比这更难。
我也尝试过使用sprintf,但它会将我的空值变成实际的0,所以0x0000会变成2'0'ASCII字符!
答案 0 :(得分:2)
如果要将其作为数据包发送,则需要注意字节顺序(htons
)。创建自己的功能,创建“数据包”。
memcpy
)。不要忘记htons
您可能只想write
struct
到套接字。 你不应该这样做,因为不能保证接收机器上的字段布局是相同的(填充?)。
答案 1 :(得分:0)
您确实可以简单地将指向结构的指针转换为char *,例如:
#include <stdlib.h> /* for size_t */
....
struct query q;
/* fill in the struct ... */
char *packet = (char *)(&q);
size_t packet_size = sizeof(struct query);
如果您希望数据包大小修剪查询结构的内容,则必须计算差异(例如,通过在内容上使用strnlen并减去差异)
编辑:或者修剪你可以做:
int packet_size = (&(q.content[0]) + strnlen(q.content, 512)) - &q;