【问题标题】:Send struct, float and int over UDP sockets in C++在 C++ 中通过 UDP 套接字发送 struct、float 和 int
【发布时间】: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 endiannesssize of an integer being different
  • floats 的问题在于它们是特定于平台/架构的,因此如果您将它们发送到不同的平台/架构,您可能会更好地发送文本而不是二进制文件。跨度>

标签: c++ serialization struct udp


【解决方案1】:

稍作调整,您展示的代码将在 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);

【讨论】:

    猜你喜欢
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多