第十一章 名字和地址转换

struct hostent {

char *h_name;        官方主机名

char **h_aliases;    别名字符串的指针数组

int h_addrtype;        IP地址类型

int h_length;            IP地址长度

char **h_addr_list;    IP地址字符串的指针数组

};

有一个hostent.c的例子,然后我想写一个gethostbyaddr的例子,但是遇到了问题,

描述一下:

#include <stdio.h>
#include <unistd.h>
#include <netdb.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
    char *ptr, **pptr;
    char str[INET_ADDRSTRLEN];
    struct hostent *hptr;
    struct sockaddr_in addr;
    while (-- argc > 0) {
        ptr = * ++argv;
        inet_pton(AF_INET, ptr, &addr.sin_addr);
        if ((hptr = gethostbyaddr(&addr.sin_addr, sizeof(addr.sin_addr), AF_INET)) == NULL) {
             /* 在这里总是查不到?为什么呢? 书中说是in_addr结构的指针,传参应该没错的*/
            printf("gethostbyaddr() error: %s:%s\n", ptr, hstrerror(h_errno));
            continue;
        }
        printf("official hostname: %s\n", hptr->h_name);
        for (pptr = hptr->h_aliases; *pptr != NULL; pptr ++)
            printf("\talias: %s\n", *pptr);
        switch (hptr->h_addrtype) {
        case AF_INET:
            pptr = hptr->h_addr_list;
            for (; *pptr != NULL; pptr ++)
                printf("\taddress: %s\n", inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));
            break;
        default:
            printf("unknown address type\n");
            break;
        }
    }
    return 0;
}

为什么每次都是:

gethostbyaddr() error: 119.75.217.109:Unknown host

这个问题我先放下了,继续看后面的:

struct servent {

char *s_name;        //    官方服务名称

char **s_aliases;    //    别名

int s_port;            //    端口号,还是网络字节序的,这个是这个结构里最重要的东西了

char *s_proto;    //    服务使用的协议

};

struct servent *getservbyport(int port, const char *protoname);

这个函数中port依然要求是网络字节序的,填写时需要使用htons()来转换。

接下来又有一个例子,是传入主机名和服务名来显示时间的,这个我用www.baidu.com还有www.google.com都是不行,

他们都是不开启这个功能的,我用的是RedHat6.3server系统,所以在root权限下,使用ntsys命令,可以打开开启

各种服务的选项,把daytime-dgram和daytime-stream启用就可以了,直接试自己的IP地址来测试就行了。

int getaddrinfo(

                            const char *hostname, //主机名和地址串都可以

                            const char *service, //服务名和十进制端口号串都可以

                            const struct addrinfo *hints, //可以为NULL,或者控制返回的信息

                            struct addrinfo **result);//这就是返回的信息,结构链表


struct addrinfo {

    int ai_flags;    //指定一些限制

    int ai_family;    //   AF_xxx

    int ai_socktype;    //    SOCK_xxx

    int ai_protocol;    //    IPPROTO_xxx

    socklen_t ai_addrlen;

    char *ai_canonname;    //主机的官方名

    struct sockaddr *ai_addr;

    struct addrinfo *ai_next;    //这个链长度和IP地址个数还有服务支持的类型有关

};

你可能感兴趣的:(第十一章 名字和地址转换)