使用gethostname()函数和gethostbyname()函数获取主机相关信息
gethostname():返回本地主機(jī)的標(biāo)準(zhǔn)主機(jī)名
原型如下:
#include <unistd.h> int gethostname(char *name, size_t len); 參數(shù)說明: 這個(gè)函數(shù)需要兩個(gè)參數(shù):接收緩沖區(qū)name,其長(zhǎng)度必須為len字節(jié)或是更長(zhǎng),存獲得的主機(jī)名。接收緩沖區(qū)name的最大長(zhǎng)度: 返回值:如果函數(shù)成功,則返回0。如果發(fā)生錯(cuò)誤則返回-1.錯(cuò)誤號(hào)存放在外部變量errno中。gethostbyname()函數(shù)說明----用域名或主機(jī)名獲取IP地址
包含頭文件 #include <netdb.h> #include <sys/socket.h>函數(shù)原型: struct hostent *gethostbyname(const char *name); 這個(gè)函數(shù)的傳入值是域名或者主機(jī)名,例如"www.google.cn"等等。傳出值,是一個(gè)hostent的結(jié)構(gòu)。如果函數(shù)調(diào)用失敗,將返回NULL。 返回hostent結(jié)構(gòu)體類型指針: 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
? ?表示的是主機(jī)的規(guī)范名。例如www.google.com的規(guī)范名其實(shí)是www.l.google.com.
?hostent->h_aliases
? ? 表示的是主機(jī)的別名www.google.com就是google他自己的別名。有的時(shí)候,有的主機(jī)可能有好幾個(gè)別名,這些,其實(shí)都是為了易于用戶記憶而為自己的網(wǎng)站多取的名字。
? hostent->h_addrtype
? ? 表示的是主機(jī)ip地址的類型,到底是ipv4(AF_INET),還是ipv6(AF_INET6)
? hostent->h_length
? ? 表示的是主機(jī)ip地址的長(zhǎng)度
? hostent->h_addr_list
? ? 表示的是主機(jī)的ip地址,注意,這個(gè)是網(wǎng)絡(luò)字節(jié)存儲(chǔ)的。千萬不要直接用printf帶%s參數(shù)來打這個(gè)東西,會(huì)有問題的哇。所以到真正需要打印出這個(gè)IP的話,需要調(diào)用inet_ntop()。
? const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);
? ? 這個(gè)函數(shù),是將類型為af的網(wǎng)絡(luò)地址結(jié)構(gòu)src,轉(zhuǎn)換為主機(jī)序的字符串形式,存放在長(zhǎng)度為cnt的字符串中。返回指向dst的一個(gè)指針。如果函數(shù)調(diào)用錯(cuò)誤,返回值是NULL。
? 示例如下:
#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\n", 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\n", hp->h_name);printf(" ip:%s\n", inet_ntoa(*(struct in_addr*)hp->h_addr_list[i]));i++;}return 0; }? ? 編譯運(yùn)行
? -------------------------
# gcc -o getinfo getinfo.c #./getinfohostname:www.server1.comip:69.172.201.208? 注意:試驗(yàn)時(shí)主機(jī)名要是域名格式(如www.server1.com,若函數(shù)為server1時(shí)gethostbyname函數(shù)返回為NULL),gethostbyname()函數(shù)才能獲取到信息,否則返回NULL。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的使用gethostname()函数和gethostbyname()函数获取主机相关信息的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: getsockname和getpeern
- 下一篇: 《Cocos2d-x3.x游戏开发之旅》