Linux 主機名服務名位址轉換函式

2021-07-23 23:28:11 字數 3918 閱讀 2071

1、gethostbyname, gethostbyaddr

一般來說,網路中使用的位址都是網域名稱位址,這樣更加直觀可讀,需要將位址進行相應的轉換來獲取實際需要的位址形式。

/* gethostbyname

* 返回值:成功則為非null,錯誤則為null且設定h_errno;

* 定義:

*/#include

struct hostent *gethostbyname(const

char *hostname);

struct hostent;

/* 說明:

* 函式執行a記錄查詢,只能返回ipv4位址;

* 函式的返回結構包含有以下資訊:

* 1、主機官方名;

* 2、主機別名,可以有多個;

* 3、位址家族型別;

* 4、位址長度(ip);

* 5、ip位址,這是個指標,可以有多個;

*/

/* gethostbyaddr

* 返回值:成功則為非null,錯誤則為null且設定h_errno;

* 定義:

*/#include

struct hostent *gethostbyaddr(const

char *addr, socklen_t len, int family);

/* 說明:

* 引數addr不是字串指標,而是ipv4位址中某個in_addr結構指標;

* len為addr的長度,family為af_inet;

* 函式就是通過套接字中的二進位制ip位址來進行主機位址查詢;

*/

2、getservbyname,getservbyport

對於服務(http,ftp,domain)來說,也是經常用名字來認知的,但是服務一般都是對應埠的,有時需要在服務名和埠間進行轉換等操作,這裡需要相應的函式來返回對應於給定服務名和協議名的相關服務資訊(服務和埠都是固定分配定義好的,如埠80用於網頁服務, 開放埠除外)。

/* getservbyname

* 返回值:成功則為非空指標,失敗則為null;

* 定義:

*/#include

struct servent *getservbyname(const

char *servname, const

char *protoname);

struct servent;

/* 說明:

* servname為服務名稱,protoname為協議名稱(tcp,udp);

* 伺服器和協議名要保持正確,不能給要給服務不支援的協議;

* 返回的服務結構型別包含資料:

* 1、官方服務名;

* 2、服務別名列表;

* 3、服務埠號,網路位元組序;

* 4、使用的協議;

*/

/* getservbyport

* 返回值:成功則為非空指標,失敗則為null;

* 定義:

*/#include

struct servent *getservbyport(int port, const

char *protoname);

/* 說明:

* 和函式getservbyname作用相同,區別在於這裡利用的是埠號進行查詢;

* port必須為網路位元組序,即若查詢埠80則引數為htons(80),服務名返回為www;

*/

3、getaddrinfo

函式能夠進行名字到位址和服務到埠的轉換,前面的幾個函式只能處理ipv4,這個函式可以處理ipv4和ipv6,返回的是乙個sockaddr結構,可以直接用於套接字函式。

/* 

* 返回值:成功則為0,出錯則非0;

* 定義:

*/#include

int getaddrinfo(const

char *hostname, const

char *service,

const

struct addrinfo *hints, struct addrinfo **result);

/* 說明:

* hostname為乙個主機名或點分十進位制位址串,service為服務名或十進位制埠號;

* hints可以是乙個空指標,也可以是乙個結構指標,用來進行輸出設定;

* result為返回資訊,若是有多個位址,則會有多個結構指標返回;

*/struct addrinfo;

/* 說明:

* hints結構可以設定前面4個int型資料;設空指標則ai_family為af_unspec,其他為0;

* 具體細節引數需了解ai_flags標誌;

*/

參考:getaddrinfo函式詳解; unix套接字程式設計卷1;

4、freeaddrinfo

/* 

* 函式功能:釋放記憶體;

* 定義:

*/#include

void freeaddrinfo(struct addrinfo *ai);

/* 說明:

* 呼叫getaddrinfo函式會返回的所有空間都是動態獲取的;

* 通過呼叫函式freeaddinfo來釋放動態儲存空間;

*/

5、getnameinfo

getnameinfo函式功能與getaddrinfo函式功能相反,它通過傳入乙個套接字結構資料,返回主機的位址的服務名稱,函式為協議無關,無需關心在套接字位址結構中的協議位址的型別。

/* 

* 函式功能:返回套接字中描述主機和服務的字串;

* 返回值:成功則為0,出錯則非0;

* 函式定義

*/#include

int getnameinfo(const

struct sockaddr *sockaddr, socklen_t addrlen,

char *host, socklen_t hostlen,

char *serv, socklen_t servlen, int falgs);

/* 說明:

* 前面兩個引數為輸入引數,乙個為套接字結構指標,乙個為該套接字長度;

* host指向輸出主機字串,hostlen為其長度,不想輸出host,則hostlen可以置為0;

* serv執行輸出服務字串,servlen為其長度,不限輸出serv,則servlen可以置為0;

* flags用於改變函式操作,有下面的取值:

* 1、ni_dgram:只用於處理資料報;

* 2、ni_namereqd:不能解析出名字則返回錯誤;

* 3、ni_nofqdn:返回的主機名第乙個點號之後的部分被截掉;

* 5、ni_numericserv:以十進位制數以字串形式返回服務名(埠號);

* 各標誌可以進行組合;

總結:

乙個網路主機的與另乙個主機進行資料交換需要雙方的網路位址,包括ip位址和埠號。一般來說,為了簡便使用,我們使用dns(網域名稱系統)定義乙個名字來標識乙個ip位址,用服務名來標識乙個埠號。有時我們需要進行這兩種表達方式之間的轉換,這就需要上面介紹的一些函式了。

gethostbyname和gethostbyaddr就是用於主機名稱的轉換函式,前者通過網域名稱可以獲取ip位址,後者可以通過ip獲取網域名稱,兩者返回的值型別一樣,需要的資料都可以在結構hostent中找到。getservbyname和getservbyport則是針對埠號的轉換函式。

gethostbyname和gethostbyaddr函式只能應用於ipv4,有一定的侷限性。getaddrinfo和getnameinfo函式解決了這個問題,可以同時處理ipv4和ipv6。

linux檢視主機名

vi etc sysconfig network networking yes networking ipv6 no hostname idc 183 主機名 root idc 183 release cat etc hosts do not remove the following line,or...

Linux主機名修改

hostname命令可以臨時修改機器名 hostname 檢視機器名 hostname i 檢視本機器名對應的ip位址 hostname xx 修改機器名為xx 修改配置檔案實現修改機器名 vi etc sysconfig network 修改hostname xx vi etc hosts 把預設...

修改linux主機名

1.修改centos主機名稱配置檔案 etc sysconfig network vi etc sysconfig network 修改hostname配置為想要的名稱,例如 networking yes networking ipv6 no hostname roothomes 2.修改 etc ...