Linux获取本机hostname函数,Linux下获得主机与域名-gethostbyname和gethostbyaddr
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相关推荐
- linux获取机器cpuid地址函数,Linux下获取CPUID、硬盘序列号与MAC地址
在很多系统软件的开发中,需要使用一些系统的唯一性信息.所以,得到主机的CPUID.硬盘序列号及网卡的MAC地址,就成个一件很重要的应用. 本人经过一番google即自己的钻研,基本上实现了这几个功能. ...
- java:获取本机IP,Linux环境下使用InetAddress.getLocalHost()方法获得127.0.0.1
知道InetAddress.getLocalHost()方法是可以获取本地ip的,但是在mac电脑上执行的时候,偶尔会得到127.0.0.1的输出,这样拿到本地ip很不稳定,感觉就很不靠谱了 目录 I ...
- linux获取本机IP地址
转自:http://blog.csdn.net/bailyzheng/article/details/7489656 ifaddrs结构体定义如下: C代码 struct ifaddrs { st ...
- linux获取系统信息(sysinfo函数的使用)
sysinfo结构体 Linux中,可以用sysinfo来获取系统相关信息. Linux中,sysinfo是用来获取系统相关信息的结构体. 函数声明和原型: #include <sys/sysi ...
- linux c设置系统时间函数,Linux C 中获取local日期和时间 time()localtime()函数
#include #define _DATETIME_SIZE 32 // GetDate - 获取当前系统日期 /** * 函数名称:GetDate * 功能描述:取当前系统日期 * * 输出参数: ...
- linux读取文件修改时间函数,Linux服务器编程之utime()函数修改文件存取时间
Linux服务器编程之utime()函数修改文件存取时间 C语言utime()函数:修改文件的存取时间和更改时间 头文件: #include #include 定义函数: int utime(cons ...
- linux获取完整的man(manpages)linux参考手册/中文man的下载和使用/获取buildin 命令的完整帮助文档/多种man手册/man着色colorful man
文章目录 获取完整的man(manpages)linux参考手册/中文man的下载和使用/获取buildin 命令的完整帮助文档 搜索manpages 相关package 安装扩展man手册 refe ...
- linux连接本机mysql数据库,Linux中MySQL连接本机数据库客户端
Linux中MySQL连接本机数据库客户端 Linux中MySQL连接本机数据库客户端 1.登入mysql数据库 2.找到要修改的位置 // 选定要用的数据库(用show databases;看完再u ...
- Linux ct获取本机ip,[原]archlinux 下最新的netct工具配置ip地址
archlinux官方使用了netctl替代netcfg工具,更适合配合systemd使用 [code] sudo netctl enable ethernet-master 自动通过systemct ...
最新文章
- GDCM:gdcm::Codec的测试程序
- [RN] React Native 实现图片预览
- opencv图像处理时使用stringstream批量读取图片,处理后并保存
- [TJOI2009] 战争游戏
- Hash (散列,哈希)
- 程序员不会SQL?骨灰级工程师:全等着被淘汰吧!这是必会技能!
- linux装系统到u盘,萌新的Linux之路(1):安装Linux系统到U盘
- 纯CSS实现的蓝色竖向导航代码
- windows命令查找程序_如何在Windows 10上查找和设置屏幕保护程序
- 云计算给IT产业结构带来的影响 .
- 剑指offer T32及其变种从上到下打印二叉树(之字型打印)
- 路由器ACL(访问控制列表)详解
- 分享受用一生的高效 PyCharm 使用技巧。
- LiveData 机制详解
- html中将scss转编译为css,SASS把scss转化为css的四种转化方式与命令
- AppleParty(苹果派)v3 支持 App Store 新定价机制 - 批量配置自定价格和销售范围
- 音视频技术开发周刊 | 247
- WP版网易云,解决启动慢问题
- VS2019 .NetCore智能提示从英文变成中文设置
- m瑞利信道下对比ZF-SIC,MMSE-SIC,MRC三种均衡算法的误码率matlab仿真
热门文章
- Java -- 泛型
- 序列计数(动态规划/自动机/前缀和优化)
- 【洛谷P4841】城市规划【指数型生成函数】【麦克劳林级数】【多项式对数】
- P4248 [AHOI2013]差异
- 牛客题霸 [螺旋矩阵] C++题解/答案
- P3964-[TJOI2013]松鼠聚会【计算几何】
- P1903-[国家集训队]数颜色/维护队列【带修莫队】
- nssl1209-奇怪的队列【贪心,权值线段树】
- POJ2689-Prime Distance【质数,数论】
- 【2018.3.31】模拟赛之二-ssl2407 负进制【贪心】