我正在使用 C语言,这是服务器和客户端的通用平台。
我有一个特定类型的结构,我想从服务器发送给客户端。
例如
服务器代码
//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);
所以,基本上我想从服务器向客户端发送一个结构。但是从上面的代码中我得到了分段错误,我不确定这种结构转移是否可行。有什么出路吗?
答案 0 :(得分:6)
首先,你必须使用malloc()来为struct hostent分配内存。 你可以通过sendto()/ recvfrom()来传递一个struct,但是由于struct hostent包含指针,所以这个结构的成员只要被转移到另一端就没有任何意义。
答案 1 :(得分:4)
我会删除&在hp前面
答案 2 :(得分:4)
通常,您希望避免通过网络传输原始结构,除非它们专门设计用作网络传输,或者除非您绝对确定两端始终是完全相同的体系结构。填充和字节排序的差异可能导致数据在另一端出现乱码。您尝试传输的特定类型的结构将无法正常发送(请参阅Petros的答案)
你的发送代码中的问题是hp是一个指针,你正在对它进行处理,就像它指向的数据一样。 sizeof(hp)返回指针的大小,而不是指向的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);
答案 3 :(得分:1)
如果hp是指针,为什么要取其地址?
答案 4 :(得分:1)
您应该更正代码,如下所示:
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);
阅读有关套接字函数的文档总是有帮助的。
答案 5 :(得分:0)
顺便说一句,如果我在你的帖子中考虑非常通用的问题,即"我想从服务器发送结构到客户端",我建议在SO上查看以下帖子: