我想在用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;
我试图查找此错误,并发现我必须在发送之前序列化结构,然后反序列化相同以获得确切的结构。你能建议/或提供一个如何序列化和反序列化的例子吗?
答案 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);