gethostname、gethostbyname

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

 

原型:

#include<unistd.h>

int gethostname(char *name, size_t len);

 

参数说明:

name:  接收缓冲区,字节长度必须为len,或更长,存获取主机名

len:      接收缓冲区name的最大长度

 

返回值:

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

 

复制代码
/*
gethostname.c
*/
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

#define ERR_EXIT(m) \
    do {\
        perror(m); \
        exit(EXIT_FAILURE); \
    }while(0);

int main()
{
    char name[256];
    if (gethostname(name, sizeof(name)))
    {
        ERR_EXIT("gethostname");
    }

    printf("hostname = %s\n",name);
    
    return 0;        
}
复制代码

 

运行结果:

 

 

gethostbyname()

 

函数原型:

#include <netdb.h>
#include <sys/socket.h>
struct hostent *gethostbyname(const char *name);

 

参数说明:

name:域名或主机名

 

返回值:

调用成功,返回一个hostent结构,若函数调用失败,返回NULL

 

返回的hostent结构体类型的指针:

复制代码
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),还是ipv6(AF_INET6)

 

  hostent->h_length 

    表示的是主机ip地址的长度

 

  hostent->h_addr_list 

  表示的是主机的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。

 

复制代码
/*
gethostbyname.c
*/
#include<stdio.h>
#include<netdb.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/socket.h>

int main()
{
    char name[256];
    gethostname(name,sizeof(name));
    printf("hostname = %s\n",name);

    struct hostent *hp;
    if ((hp = gethostbyname(name)) == NULL)
    {
        printf("gethostbyname error");
    }

    int i = 0;
    while(hp->h_addr_list[i] != NULL)
    {
        printf("hostname : %s\n",hp->h_name);
        printf("\tip:%s\n",inet_ntoa(*(struct in_addr*)hp->h_addr_list[i]));
        i++;
    }
    return 0;
}
复制代码

 

运行结果:

 

 

 

 

 

 

posted @   王清河  阅读(434)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示