基本上我有一个包含不同类型数据的自定义结构。例如:
typedef struct example_structure{
uint8_t* example_1[4];
int example_2[4];
int example_3;
} example_structure;
我需要做的是将此结构的上下文复制到const char* buffer
,以便我可以使用winsock2的buffer
函数发送复制的数据(send(SOCKET s, const char* buffer, int len, int flags)
)。我尝试使用memcpy()
,但我不会只是复制指针的地址而不是数据吗?
答案 0 :(得分:1)
是的,如果您通过套接字复制或发送该结构,则最终会复制/发送指针,但这对收件人来说显然毫无意义,但是,如果收件人在不同的硬件上运行(例如,不是相同的端) ,无论如何,所有数据都可能毫无意义。最重要的是,结构成员之间填充量的差异也可能成为一个问题。
对于非平凡的情况,最好使用现有协议(例如protobuf),或推出自己的协议,同时牢记数据硬件表示的潜在差异。
答案 1 :(得分:0)
您需要先设计一个协议,然后才能根据该协议对数据进行编码。确切地确定如何在字节级别对数据进行编码。然后编写代码以对您决定的格式进行编码和解码。
不要跳过在字节级实际记录有线协议的步骤。我保证,它会在以后拯救你。
有关详细信息,请参阅this answer。
答案 2 :(得分:0)
const char* buffer
此缓冲区具有常量值,因此您无法复制任何内容。你可能不需要复制任何东西。只需以这种方式使用send
功能:
send(s, (char*)&example_structure, sizeof(structure), flags)
但是结构中的指针存在问题(uint8_t* example_1[4];
)。
在不同的应用程序/机器之间发送指针是没有意义的。
答案 3 :(得分:0)
嗯,你的结构包含uint8_t *
个字段,看起来像C字符串...复制或发送指针没有意义,这只是发送过程中的一个内存地址用户空间。
如果你的结构已经(注意,没有指针):
typedef struct example_structure{
uint8_t example_1[4];
int example_2[4];
int example_3;
} example_structure;
如果你在完全相同的架构(相同的硬件,相同的编译器,相同的编译器选项)上传输它,你可以做到:
example_structure ex_struc;
// initialize the struct
...
send(s, &ex_struc, sizeof(ex_struc), flags);
即使在这种情况下,我强烈建议您定义和使用协议 - 正如@DavidSchwartz已经说过的那样,它可以为您节省时间和麻烦......
但是,正如你有指针,你不能这样做,必须定义一个协议。
它可能是(但您可以自由地优先使用小端序,或者每个int使用2或8个字节,具体取决于您的实际数据):
uint8_t
数组的长度,后跟数组这清楚地定义了消息的格式。