在 UDP 套接字上发送结构、浮点数和 int C++

Send struct, float and int over UDP sockets in C++

本文关键字:浮点数 int C++ 结构 UDP 套接字      更新时间:2023-10-16

我想在用C++编写的客户端/服务器套接字程序中发送/接收包含浮点数和整数变量的结构。

早些时候,代码是用 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"的"(匿名结构(*"转换为"char *"到"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);