代码之家  ›  专栏  ›  技术社区  ›  handora

gethostbyname()能否返回IPv6地址?

  •  2
  • handora  · 技术社区  · 7 年前

    我在看报纸 ,并提出一个关于练习11.4的问题,以支持代码 gethostbyname 对于 . 书中的答案如下:

    #include    "unp.h"
    
    int
    main(int argc, char **argv)
    {
        int                 sockfd, n;
        char                recvline[MAXLINE + 1];
        struct sockaddr_in  servaddr;
        struct sockaddr_in6 servaddr6;
        struct sockaddr     *sa;
        socklen_t           salen;
        struct in_addr      **pptr;
        struct hostent      *hp;
        struct servent      *sp;
    
        if (argc != 3)
            err_quit("usage: daytimetcpcli3 <hostname> <service>");
    
        if ( (hp = gethostbyname(argv[1])) == NULL)
            err_quit("hostname error for %s: %s", argv[1], hstrerror(h_errno));
    
        if ( (sp = getservbyname(argv[2], "tcp")) == NULL)
            err_quit("getservbyname error for %s", argv[2]);
    
        pptr = (struct in_addr **) hp->h_addr_list;
        for ( ; *pptr != NULL; pptr++) {
            sockfd = Socket(hp->h_addrtype, SOCK_STREAM, 0);
    
            if (hp->h_addrtype == AF_INET) {
                sa = (SA *) &servaddr;
                salen = sizeof(servaddr);
            } else if (hp->h_addrtype == AF_INET6) {
                sa = (SA *) &servaddr6;
                salen = sizeof(servaddr6);
            } else
                err_quit("unknown addrtype %d", hp->h_addrtype);
    
            bzero(sa, salen);
            sa->sa_family = hp->h_addrtype;
            sock_set_port(sa, salen, sp->s_port);
            sock_set_addr(sa, salen, *pptr);
    
            printf("trying %s\n", Sock_ntop(sa, salen));
    
            if (connect(sockfd, sa, salen) == 0)
                break;      /* success */
            err_ret("connect error");
            close(sockfd);
        }
        if (*pptr == NULL)
            err_quit("unable to connect");
    
        while ( (n = Read(sockfd, recvline, MAXLINE)) > 0) {
            recvline[n] = 0;    /* null terminate */
            Fputs(recvline, stdout);
        }
        exit(0);
    }
    

    有了这本书和其他资源的信息,我发现 gethostbyname . 所以我的问题是 gethostbyname 可以返回有关的信息 ,或者只是代码错误?

    我认为这个问题不会取代 ,我想知道这个代码的正确性。

    1 回复  |  直到 7 年前
        1
  •  3
  •   alk    7 年前

    gethostbyname() 不再是(当前)POSIX(IEEE Std 1003.1-2008,2016版)的一部分。

    It explicitly mentions :

    过时的 h_errno公司 外部整数和废弃 gethostbyaddr() 找不到HOST\u , , 再试一次


    最后一个POSIX版本支持 是IEEE Std 1003.12004年版, which states :

    struct hostent *gethostbyname(const char *name);
    

    [...]

    函数应返回包含地址族地址的条目 AF_INET .

    AF_INET6 完全


    因此,从POSIX的角度来看,您的问题是

    此代码的正确性。

    • 过去是 AF_INET6 ).
    • 否,截至 任何更多,作为 gethostbyname()