【发布时间】:2017-08-26 06:04:40
【问题描述】:
我想在用 C++ 编写的客户端/服务器套接字程序中发送/接收包含 float 和 int 变量的结构。
之前,代码是用 C 编写的,所以我只是将它们发送如下:
//structure definition
struct {
float a;
float b;
float c;
float d[2];
}myStruct_;
//code to send struct
int slen = sizeof(client_sock)
if(recvfrom(sockFD, &myStruct_, sizeof(myStruct_), 0 ,(struct sockaddr *)&client_sock, &slen)<0) {
printf("Failure while receiving data %d" , WSAGetLastError());
getchar();
exit(1);
}
但是现在在 C++ 中,这给了我这个错误信息:
错误:无法将参数 '2' 的 '(anonymous struct)*' 转换为 'char *' 到 'int recvfrom(SOCKET, char*, int, int, sockaddr*, int*)'
我试图寻找这个错误,发现我必须在发送之前序列化结构,然后再反序列化它以获得确切的结构。您能否建议/或提供一个如何序列化和反序列化的示例?
【问题讨论】:
-
你可以像这样投射它:(char *)&myStruct
-
如果我将其转换为 (char *) 那么我如何在接收器端取回原始结构?
-
在接收端,您将相同的
struct的地址转换为char*并将接收缓冲区复制到其中。 -
“同样的事情对 float 和 int 变量有效吗?”可能是。在不同的平台和编译器工具包上发现 are endianness 和 size of an integer being different。
-
floats 的问题在于它们是特定于平台/架构的,因此如果您将它们发送到不同的平台/架构,您可能会更好地发送文本而不是二进制文件。跨度>
标签: c++ serialization struct udp