3

我正在使用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);

所以,基本上我想将一个结构从服务器发送到客户端。但是从上面的代码中我得到了分段错误,我不确定这种结构转移是否可行。有什么出路吗?

4

6 回答 6

6

首先,您必须 malloc() 才能为 struct hostent 分配内存。您可以通过 sendto()/recvfrom() 传输结构,但由于 struct hostent 包含指针,因此该结构的指针成员一旦传输到另一端就没有意义。

于 2009-08-04T19:25:26.673 回答
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);
于 2009-08-04T19:11:09.353 回答
4

我会删除 hp 前面的 &

于 2009-08-04T19:06:11.673 回答
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);

阅读有关套接字函数的文档总是有帮助的。

于 2009-08-04T19:24:23.867 回答
1

如果 hp 是一个指针,你为什么要取它的地址?

于 2009-08-04T19:08:02.417 回答
0

顺便说一句,如果我考虑您帖子中非常笼统的问题,即“我想将结构从服务器发送到客户端”,我建议您查看以下关于 SO 的帖子:

通过 C 中的套接字传递结构

于 2013-10-29T19:28:39.463 回答