我想在用 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++ 中,这给了我这个错误信息:
error: cannot convert '(anonymous struct)*' to 'char *' for argument '2' to 'int recvfrom(SOCKET, char*, int, int, sockaddr*, int*)'
我试图寻找这个错误,发现我必须在发送前序列化该结构,然后再反序列化它以获得准确的结构。你能建议/或提供一个如何序列化和反序列化的例子吗?
最佳答案
您展示的代码只需稍作调整即可在 C++ 中正常运行。
在某些平台(如 Linux)中,recvfrom()
被定义为需要一个指向它将填充的内存缓冲区的 void*
指针。在其他平台中 (像 Windows),recvfrom()
需要一个 char*
指针。
要消除错误,只需对缓冲区指针进行类型转换(就像您对第 5 个参数所做的那样,您传递的是 sockaddr_in*
指针,其中 sockaddr*
需要指针):
recvfrom(sockFD, (char*)&myStruct_, sizeof(myStruct_), 0, (struct sockaddr *)&client_sock, &slen);
发送结构时做同样的事情:
sendto(sockFD, (char*)&myStruct_, sizeof(myStruct_), 0, (struct sockaddr *)&server_sock, &slen);
关于c++ - 在 C++ 中通过 UDP 套接字发送结构、 float 和整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43149622/