c++ - 在 C++ 中通过 UDP 套接字发送结构、 float 和整数

标签 c++ serialization struct udp

我想在用 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/

相关文章:

c++ - 让它在 C++ 中发出蜂鸣声

c++ - Qt 在 Linux 中无法正确读取字符串

java - 如何处理spring-security-oauth2的版本升级?

c++ - 空结构和匿名 union 怪事

optimization - 使用 "if let"解包堆栈对象(例如结构)

c++ - 如何从本地目录加载 C++ 中的图像

c++ - 从最多 X 个字符构造 std::string,在空字符处停止

javascript - 一个棘手的javascript问题

c# - 从 FTP 目录读取文件夹路径到 IEnumerable

c - C 中带指针和结构的链表