1.数据结构hostent和servent:

struct hostent{

char *h_name;/* official domain name of host */

char **h_aliases;/* null-terminated array of domain names */

int h_addrtype;/* host address type (AF_INET) */

int h_length;/* length of an address, in bytes */

char **h_addr_list;/* null-terminated array of in_addr structs */

};

#define h_addr h_addr_list[0]

这里是这个数据结构的详细资料:

char *h_name :表示的是主机的规范名。例如的规范名其实是。

char**h_aliases:表示的是主机的别名。就是google他自己的别名。有的时候,有的主机可能有好几个别名,这些,其实都是为了易于用户记忆而为自己的网站多取的名字。

inth_addrtype :表示的是主机ip地址的类型,到底是ipv4(AF_INET),还是ipv6(AF_INET6)

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

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

结构体servent

typedef struct servent {

char FAR* s_name; //正规的服务名char FAR FAR** s_aliases;

short s_port; //连接到该服务时需要用到的端口号char FAR* s_proto;

} servent;

2.取得主机名与域名

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

原型如下:

#include

int gethostname(char *name, size_t len);

参数说明:

这个函数需要两个参数:

接收缓冲区name,其长度必须为len字节或是更长

接收缓冲区name的最大长度

返回值:

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

2.2 getdomainname(2)函数:可以允许程序获得程序正运行的主机的NIS域名。

原型如下:

#include

int getdomainname(char *name,size_t len);

参数说明:

这个函数的用法也gethostname相同。

2.3测试getdomainname与gethostname函数

下面这个程序演示了这两个函数的用法。这个程序只是简单的调用这两个函数并报告其结果。

/*gethostn.c

*

* Example of gethostname(2):

*/

#include

#include

#include

#include

#include

int main(int argc,char **argv)

{

int z;

char buf[32];

z = gethostname(buf,sizeof buf);

if(z==-1)

{

fprintf(stderr,"%s:gethostname(2)\n",strerror(errno));

exit(1);

}

printf("host name = '%s'\n",buf);

z = getdomainname(buf,sizeof buf);

if(z==-1)

{

fprintf(stderr,"%s:getdomainname(2)\n",strerror(errno));

exit(1);

}

printf("domain name = '%s'\n",buf);

return 0;

}

这个程序的运行结果如下:

$ ./gethostn

host name = 'tux'

domain name = ''

在了解了如何获得本地系统的信息以后,现在我们就可以将我们的注意力转移到解析远程主机名上了。

3.gethostbyaddr():

struct hostent *gethostbyaddr(const char *name)

这个函数,传入值是IP地址(注意,这里不是简单的字符串,需要先将字符串形式的IP地址由inet_aton转化一下),然后经过函数处理,将结果由返回值传出。返回值是一个hostent结构.因为有了hosten这个传出的结构,我们可以在这个结构里面找到我们想需要的信息。

下面的是例程。编译后只需在命令行输入./a.out 202.102.14.141(IP地址)就可以看结果了。

#include

#include

int main(int argc, char **argv)

{

char *ptr,**pptr;

struct hostent *hptr;

char str[32];

char ipaddr[16];

struct in_addr *hipaddr;

/*取得命令后第一个参数,即要解析的IP地址*/

ptr = argv[1];

/*调用inet_aton(),ptr就是以字符串存放的地方的指针,hipaddr是in_addr形式的地址*/

if(!inet_aton(ptr,hipaddr))

{

printf("inet_aton error\n");

return 1;

}

/*调用gethostbyaddr()。调用结果都存在hptr中*/

if( (hptr = gethostbyaddr(hipaddr, 4, AF_INET) ) == NULL )

{

printf("gethostbyaddr error for addr:%s\n", ptr);

return 1; /*如果调用gethostbyaddr发生错误,返回1 */

}

/*将主机的规范名打出来*/

printf("official hostname:%s\n",hptr->h_name);

/*主机可能有多个别名,将所有别名分别打出来*/

for(pptr = hptr->h_aliases; *pptr != NULL; pptr++)

printf("alias:%s\n",*pptr);

/*根据地址类型,将地址打出来*/

switch(hptr->h_addrtype)

{

case AF_INET:

case AF_INET6:

pptr=hptr->h_addr_list;

/*将刚才得到的所有地址都打出来。其中调用了inet_ntop()函数*/

for(;*pptr!=NULL;pptr++)

printf("address:%s\n", inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));

break;

default:

printf("unknown address type\n");

break;

}

return 0;

}

4.gethostbyname():

使用这个东西,首先要包含2个头文件:

#include

#include

struct hostent *gethostbyname(const char *name);

这个函数的传入值是域名或者主机名,例如"","wpc"等等。

传出值,是一个hostent的结构(如下)。如果函数调用失败,将返回NULL。

struct hostent {

char*h_name;

char**h_aliases;

inth_addrtype;

inth_length;

char**h_addr_list;

};(对它的解释见1)

const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt):

这个函数,是将类型为af的网络地址结构src,转换成主机序的字符串形式,存放在长度为cnt的字符串中。

这个函数,其实就是返回指向dst的一个指针。如果函数调用错误,返回值是NULL。

下面是例程,有详细的注释。

#include

#include

int main(int argc, char **argv)

{

char *ptr,**pptr;

struct hostent *hptr;

char str[32];

/*取得命令后第一个参数,即要解析的域名或主机名*/

ptr = argv[1];

/*调用gethostbyname()。调用结果都存在hptr中*/

if( (hptr = gethostbyname(ptr) ) == NULL )

{

printf("gethostbyname error for host:%s\n", ptr);

return 0; /*如果调用gethostbyname发生错误,返回1 */

}

/*将主机的规范名打出来*/

printf("official hostname:%s\n",hptr->h_name);

/*主机可能有多个别名,将所有别名分别打出来*/

for(pptr = hptr->h_aliases; *pptr != NULL; pptr++)

printf("alias:%s\n",*pptr);

/*根据地址类型,将地址打出来*/

switch(hptr->h_addrtype)

{

case AF_INET:

case AF_INET6:

pptr=hptr->h_addr_list;

/*将刚才得到的所有地址都打出来。其中调用了inet_ntop()函数*/

for(;*pptr!=NULL;pptr++)

printf("address:%s\n", inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));

break;

default:

printf("unknown address type\n");

break;

}

return 0;

}

Linux获取本机hostname函数,Linux下获得主机与域名-gethostbyname和gethostbyaddr相关推荐

  1. linux获取机器cpuid地址函数,Linux下获取CPUID、硬盘序列号与MAC地址

    在很多系统软件的开发中,需要使用一些系统的唯一性信息.所以,得到主机的CPUID.硬盘序列号及网卡的MAC地址,就成个一件很重要的应用. 本人经过一番google即自己的钻研,基本上实现了这几个功能. ...

  2. java:获取本机IP,Linux环境下使用InetAddress.getLocalHost()方法获得127.0.0.1

    知道InetAddress.getLocalHost()方法是可以获取本地ip的,但是在mac电脑上执行的时候,偶尔会得到127.0.0.1的输出,这样拿到本地ip很不稳定,感觉就很不靠谱了 目录 I ...

  3. linux获取本机IP地址

    转自:http://blog.csdn.net/bailyzheng/article/details/7489656 ifaddrs结构体定义如下: C代码   struct ifaddrs { st ...

  4. linux获取系统信息(sysinfo函数的使用)

    sysinfo结构体 Linux中,可以用sysinfo来获取系统相关信息. Linux中,sysinfo是用来获取系统相关信息的结构体. 函数声明和原型: #include <sys/sysi ...

  5. linux c设置系统时间函数,Linux C 中获取local日期和时间 time()localtime()函数

    #include #define _DATETIME_SIZE 32 // GetDate - 获取当前系统日期 /** * 函数名称:GetDate * 功能描述:取当前系统日期 * * 输出参数: ...

  6. linux读取文件修改时间函数,Linux服务器编程之utime()函数修改文件存取时间

    Linux服务器编程之utime()函数修改文件存取时间 C语言utime()函数:修改文件的存取时间和更改时间 头文件: #include #include 定义函数: int utime(cons ...

  7. linux获取完整的man(manpages)linux参考手册/中文man的下载和使用/获取buildin 命令的完整帮助文档/多种man手册/man着色colorful man

    文章目录 获取完整的man(manpages)linux参考手册/中文man的下载和使用/获取buildin 命令的完整帮助文档 搜索manpages 相关package 安装扩展man手册 refe ...

  8. linux连接本机mysql数据库,Linux中MySQL连接本机数据库客户端

    Linux中MySQL连接本机数据库客户端 Linux中MySQL连接本机数据库客户端 1.登入mysql数据库 2.找到要修改的位置 // 选定要用的数据库(用show databases;看完再u ...

  9. Linux ct获取本机ip,[原]archlinux 下最新的netct工具配置ip地址

    archlinux官方使用了netctl替代netcfg工具,更适合配合systemd使用 [code] sudo netctl enable ethernet-master 自动通过systemct ...

最新文章

  1. GDCM:gdcm::Codec的测试程序
  2. [RN] React Native 实现图片预览
  3. opencv图像处理时使用stringstream批量读取图片,处理后并保存
  4. [TJOI2009] 战争游戏
  5. Hash (散列,哈希)
  6. 程序员不会SQL?骨灰级工程师:全等着被淘汰吧!这是必会技能!
  7. linux装系统到u盘,萌新的Linux之路(1):安装Linux系统到U盘
  8. 纯CSS实现的蓝色竖向导航代码
  9. windows命令查找程序_如何在Windows 10上查找和设置屏幕保护程序
  10. 云计算给IT产业结构带来的影响 .
  11. 剑指offer T32及其变种从上到下打印二叉树(之字型打印)
  12. 路由器ACL(访问控制列表)详解
  13. 分享受用一生的高效 PyCharm 使用技巧。
  14. LiveData 机制详解
  15. html中将scss转编译为css,SASS把scss转化为css的四种转化方式与命令
  16. AppleParty(苹果派)v3 支持 App Store 新定价机制 - 批量配置自定价格和销售范围
  17. 音视频技术开发周刊 | 247
  18. WP版网易云,解决启动慢问题
  19. VS2019 .NetCore智能提示从英文变成中文设置
  20. m瑞利信道下对比ZF-SIC,MMSE-SIC,MRC三种均衡算法的误码率matlab仿真

热门文章

  1. Java -- 泛型
  2. 序列计数(动态规划/自动机/前缀和优化)
  3. 【洛谷P4841】城市规划【指数型生成函数】【麦克劳林级数】【多项式对数】
  4. P4248 [AHOI2013]差异
  5. 牛客题霸 [螺旋矩阵] C++题解/答案
  6. P3964-[TJOI2013]松鼠聚会【计算几何】
  7. P1903-[国家集训队]数颜色/维护队列【带修莫队】
  8. nssl1209-奇怪的队列【贪心,权值线段树】
  9. POJ2689-Prime Distance【质数,数论】
  10. 【2018.3.31】模拟赛之二-ssl2407 负进制【贪心】