在C ++中通过UDP套接字发送struct,float和int

时间:2017-03-31 21:02:59

标签: 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 ++中,这给了我这个错误信息:

  

错误:无法转换&#39;(匿名结构)*&#39;到#char;&#39;争论&#39; 2&#39; to&#39; int recvfrom(SOCKET,char *,int,int,sockaddr *,int *)&#39;

我试图查找此错误,并发现我必须在发送之前序列化结构,然后反序列化相同以获得确切的结构。你能建议/或提供一个如何序列化和反序列化的例子吗?

1 个答案:

答案 0 :(得分: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);