我使用的 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看下面的帖子:

传递一个结构通过套接字用C

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top