为啥地址信息没有用 gethostbyname 和 inet_pton 函数正确存储?

Posted

技术标签:

【中文标题】为啥地址信息没有用 gethostbyname 和 inet_pton 函数正确存储?【英文标题】:Why address information are not properly stored with gethostbyname and inet_pton functions?为什么地址信息没有用 gethostbyname 和 inet_pton 函数正确存储? 【发布时间】:2022-01-22 22:32:52 【问题描述】:
int main (int argc, char **argv)
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    
    struct sockaddr_in addr;
    bzero(&addr,sizeof addr);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(9999);
    struct hostent *server = gethostbyname("192.168.1.139");
    printf("%s %d\n",server->h_addr,inet_pton(AF_INET,server->h_addr,&addr.sin_addr.s_addr));
    int res = connect(sockfd,(struct sockaddr *)&addr,sizeof addr);
    printf("%d\n",res); 

    while (1)
        char buf[100] = "";
        fgets(buf,100,stdin);
        send(sockfd,buf,sizeof buf,0);
    

如果我执行这段代码,我总是会得到:

$ ./client 
��� 0
-1

所以:

    为什么我得到这些随机字符?为什么我看不到 h_addr 的 IP 字符串? 为什么inet_pton的返回值为0?应该是1,0代表不成功,那为什么会失败呢? 显然,连接失败。

另外,如果我不使用 inet_pton,我会使用这一行:

bcopy((char *)server->h_addr,(char *)&addr.sin_addr.s_addr,h_length);

它有效。但是为什么它以这种方式工作而以另一种方式却没有呢??

【问题讨论】:

【参考方案1】:

我的英文不太好,请谅解。

见gethostbyname() man page。

gethostbyname() 函数为给定的主机名返回一个 hostent 类型的结构。这里的 name 是标准点表示法的主机名或 IPv4 地址(如 inet_addr(3))。如果 name 是 IPv4 地址,则不执行查找,gethostbyname() 只需将 name 复制到 h_name 字段中,并将其 struct in_addr 等效项复制到返回的 hostent 结构的 h_addr_list[0] 字段中

h_addr_list[0] 是 struct in_addr,h_addr_list[0] 是 h_addr,见下文。

结构主机

struct  hostent 
 char *  h_name;     
 char ** h_aliases; 
 int     h_addrtype;  
 int     h_length;    
 char ** h_addr_list;
;

#define h_addr  h_addr_list[0]

struct in_addr

struct in_addr 
  uint32_t s_addr;

所以,如果要查看 h_addr 的 IP 字符串,请看下面的代码。

printf("%s\n", inet_ntoa(*(struct in_addr*)server->h_addr));

您可以通过将 s_addr 的值分配为 addr.sin_addr.s_addr = *(unit32_t *)server->haddr; 来使用它

或者您可以使用addr.sin_addr.s_addr = inet_addr("192.168.1.139"); 使其更简单

【讨论】:

以上是关于为啥地址信息没有用 gethostbyname 和 inet_pton 函数正确存储?的主要内容,如果未能解决你的问题,请参考以下文章

为啥阿凡达变脸器没有用,一直都是显示missing required data

jsp修改地址栏图标 我试过在head中加<link rel=”icon” href=”/favicon.ico”>,但是都没有用。为啥?

为啥改linux改了密码却没有用

LINUX下如何用gethostname命令

为啥没有用零填充

为啥设置tortoisegit 记住账号和密码没有用