zoukankan      html  css  js  c++  java
  • 使用gethostname()函数和gethostbyname()函数获取主机相关信息

    gethostname() : 返回本地主机的标准主机名。

    原型如下:

    #include <unistd.h>

    int gethostname(char *name, size_t len);

    参数说明:

    这个函数需要两个参数:

    接收缓冲区name,其长度必须为len字节或是更长,存获得的主机名。

    接收缓冲区name的最大长度

    返回值:

    如果函数成功,则返回0。如果发生错误则返回-1。错误号存放在外部变量errno中。

    gethostbyname()函数说明——用域名或主机名获取IP地址
        包含头文件
        #include <netdb.h>
        #include <sys/socket.h>

        函数原型
        struct hostent *gethostbyname(const char *name);
        这个函数的传入值是域名或者主机名,例如"www.google.cn"等等。传出值,是一个hostent的结构。如果函数调用失败,将返回NULL。

        返回hostent结构体类型指针
              

    1
    2
    3
    4
    5
    6
    7
    8
       struct hostent {
                   char  *h_name;            /* official name of host */
                   char **h_aliases;         /* alias list */
                   int    h_addrtype;        /* host address type */
                   int    h_length;          /* length of address */
                   char **h_addr_list;       /* list of addresses */
               }
               #define h_addr h_addr_list[0] /* for backward compatibility */

        hostent->h_name
        表示的是主机的规范名。例如www.google.com的规范名其实是www.l.google.com。
        
        hostent->h_aliases
        表示的是主机的别名.www.google.com就是google他自己的别名。有的时候,有的主机可能有好几个别名,这些,其实都是为了易于用户记忆而为自己的网站多取的名字。

        hostent->h_addrtype    
        表示的是主机ip地址的类型,到底是ipv4(AF_INET),还是pv6(AF_INET6)

        hostent->h_length      
        表示的是主机ip地址的长度

        hostent->h_addr_lisst
        表示的是主机的ip地址,注意,这个是以网络字节序存储的。千万不要直接用printf带%s参数来打这个东西,会有问题的哇。所以到真正需要打印出这个IP的话,需要调用inet_ntop()。

        const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) :
        这个函数,是将类型为af的网络地址结构src,转换成主机序的字符串形式,存放在长度为cnt的字符串中。返回指向dst的一个指针。如果函数调用错误,返回值是NULL。

    实例如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #include <stdio.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <unistd.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <stdlib.h>
     
    void handler(int sig){
            printf("recv a sig=%d ",sig);
                    exit(EXIT_SUCCESS);
    }
     
     
    #define ERR_EXIT(m) 
            do
                    perror(m); 
                    exit(EXIT_FAILURE);
            }while(0);
     
    int main(void)
    {
            char host[100] = {0};
             if(gethostname(host,sizeof(host)) < 0){
                    ERR_EXIT("gethostname");
            }
     
            struct hostent *hp;
            if ((hp=gethostbyname(host)) == NULL){
                    ERR_EXIT("gethostbyname");
            }
     
            int i = 0;
            while(hp->h_addr_list[i] != NULL)
            {
                    printf("hostname: %s ",hp->h_name);
                    printf("      ip: %s ",inet_ntoa(*(struct in_addr*)hp->h_addr_list[i]));
                    i++;
            }
            return 0;
    }

    编译运行
    -----------------------------
    # gcc -o getinfo getinfo.c
    # ./getinfo

        hostname: www.server1.com

                    ip: 69.172.201.208

    注意:试验时主机名要是域名格式(如www.server1.com,若函数为server1时gethostbuname函数返回为NULL),gethostbyname()函数才能获取到信息,否则返回NULL

  • 相关阅读:
    fastapi+vue搭建免费代理IP网站部署至heroku
    如何选择免费代理ip,需要注意哪些指标值和基本参数
    如何部署MongoDB并开启远程访问Docker版
    Linux设置Frps Frpc服务开启启动
    Docker搭建VS Code Server ,设置访问密码随时随地写代码
    薅羊毛须及时 多平台微信线报提醒脚本
    python+selenium实现百度关键词搜索自动化操作
    用python selenium 单窗口单IP刷网站流量脚本
    杂记 内容会在留言中补充
    c#杂记
  • 原文地址:https://www.cnblogs.com/mingyunrangwozoudaoxianzai/p/10273123.html
Copyright © 2011-2022 走看看