使用recvfrom()和sendto()发送结构

时间:2009-08-04 19:03:21

标签: c sockets struct network-programming sendto

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

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

6 个答案:

答案 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上查看以下帖子:

Passing a structure through Sockets in C