发送结构使用recvfrom的()和SENDTO()
-
22-07-2019 - |
题
我使用的 C语言强>其是用于在服务器和客户机两者的共同的平台强>
我有一个特定类型的结构,其欲从服务器发送到客户端。
有关e.g。
服务器CODE 强>
//necessary declarations
struct hostent *hp;
hp=gethostbyname("www.google.com");
sendto(sockDes,&hp,sizeof(hp),0,(struct sockaddr *)&cli_addr,sizeof(cli_addr));
<强> 客户端代码 强>
struct hostent *hp;
msg=recvfrom(mysock,&hp,sizeof(hp),0,(struct sockaddr)&serv_addr,&size_len);
所以,基本上我想从服务器向客户端发送的结构。但是从上面的代码段我正在分段错误,我不知道这样的结构转移是否可行。有什么办法呢?
解决方案
首先,必须以对结构hostent分配存储器的malloc()。 可以传输通过SENDTO()/ recvfrom的(一个结构),但因为结构hostent包含指针,这个结构是指针已经没有意义的成员,只要它们被转移到另一端。
其他提示
我删除&在马力的前
在一般你想避免传输原始结构在网络上,除非他们专门设计用作网络传输,或者,除非你是绝对相信两端永远是完全相同的架构。在填充和字节排序的差异可能会导致数据在另一端出现乱码。的结构你试图转移的具体类型是行不通发送原始(见佩特罗斯答案)
在您发送代码的问题是,惠普是一个指针,你对待它喜欢它是它指向的数据。的sizeof(马力)返回一个指针的大小,被指向的hostent结构的不大小。此外,您在SENDTO的第二个参数创建一个指针到指针,当你不故意的。发送代码应为:
struct hostent *hp;
hp=gethostbyname("www.google.com");
sendto(sockDes,hp,sizeof(*hp),0,(struct sockaddr *)&cli_addr,sizeof(cli_addr));
您还具有在接收代码的问题。你应该为recvfrom的存储它接收到的数据分配空间。它不会给你分配它。更改接收代码这两个中的一个:
// Store on the stack
struct hostent h;
msg=recvfrom(mysock,&h,sizeof(h),0,(struct sockaddr)&serv_addr,&size_len);
或
// Store on the heap, be sure to free() when done
struct hostent * hp = malloc(sizeof(struct hostent));
msg=recvfrom(mysock,hp,sizeof(*hp),0,(struct sockaddr)&serv_addr,&size_len);
如果惠普是一个指针,你为什么走了地址?
您应该纠正的代码,如下所示:
struct hostent *p_hp = gethostbyname("www.google.com");
struct sockaddr_in cli_addr;
sendto(sockDes,p_hp,sizeof(hostent),0,(SOCKADDR *)&cli_addr,sizeof(cli_addr));
struct hostent hp;
struct sockaddr_in serv_addr;
int size_serv_addr = sizeof(serv_addr);
msg=recvfrom(mysock,&hp,sizeof(hostent),0,(SOCKADDR *)&serv_addr,&size_serv_addr);
这将始终有助于阅读socket函数的文档。
顺便说一句,如果我认为在您的文章中很普通的问题,即“我想从服务器向客户端发送一个结构”,我会建议对SO看下面的帖子:
不隶属于 StackOverflow