18 4 1 查詢主機名稱

2021-05-14 13:09:18 字數 3097 閱讀 4851

查詢主機名稱是通過訪問主機資料庫實現的,伺服器資料庫介面函式在標頭檔案

netdb.h

中定義。與此相關的函式有

sethostbyaddr()

和gethostbyname()

兩個,它們的一般形式如下:

struct hostent

*gethostbyaddr(const void

*addr, size_t len, int type);

struct hostent

*gethostbyname(const char

*name);

函式的返回值是指向

hostent

結構的指標,該結構用於儲存主機名稱等資訊,

hostent

結構的定義如下:

struct hostent ;

gethostbyaddr()

是通過ip

位址查詢主機資訊,

gethostbyname()

是通過主機名查詢主機資訊。如果在主機資料庫中沒有查到相關主機或位址的項,這些函式會返回乙個空指標。

與服務及其關聯的埠號有關的資訊可以通過

getservbyname()

函式和getservbyport()

函式查詢,它們的一般形式如下:

struct servent

*getservbyname(const char

*name, const char

*proto);

struct servent

*getservbyport(int port, const char

*proto);

其中,proto

引數指定了用來連線到該項服務的協議,

sock_stream

型別的tcp

連線對應的是

tcp,

udp連線對應的是

udp。函式的返回值是

servent

結構指標,該結構的定義如下:

struct servent ;

如果需要將位址資訊轉換為四分十進位制法表示,可使用

inet_ntoa()

函式來完成。該函式被包含在標頭檔案「

arpa/inet.h

」中,它的一般形式是:

char

*inet_ntoa(struct in_addr in);

如果執行成功,它將返回乙個指向四分十進位制法表示位址的字串的指標,否則返回

–1。查詢當前主機的主機名的函式是

gethostname()

,該函式的一般形式是:

int gethostname(char

*name, int namelength);

如果執行成功,

*name

引數所指向的記憶體空間將被寫入主機名,

namelength

引數限定了

*name

引數所指向記憶體空間的長度。如果主機名太長,會被截短到

namelength

限定的長度。函式執行成功時返回

0,否則返回

–1。下面用乙個示例說明查詢主機名稱操作的方法:

#include //

包含套接字相關函式

#include //

包含af_inet

相關結構

#include //

包含讀取主機資訊的相關函式

#include

#include

int main(int argc, char

*argv)

servinfo = getservbyname("daytime", "tcp");//

獲得服務資訊

if (!servinfo)

printf("daytime

服務埠是:

%d/n", ntohs(servinfo -> s_port));

// 輸出埠資訊

sockfd = socket(af_inet, sock_stream, 0);//

建立套接字

address.sin_family = af_inet;

// 定義套接字位址中的域

address.sin_port = servinfo -> s_port;

// 定義套接字埠

address.sin_addr =

*(struct in_addr *)

*hostinfo -> h_addr_list;

// 定義套接字位址

len = sizeof(address);

result = connect(sockfd, (struct sockaddr

*) &address, len);

// 請求連線

if (result == -1)

result = read(sockfd, buffer, sizeof(buffer));//

接收資料

buffer[result] = '/0';

printf("

讀取%d

位元組:%s", result, buffer);//

輸出資料

close(sockfd);//

關閉連線

return 0; }

執行程式時,將乙個

unix

伺服器位址作為該程式的執行引數。

daytime

服務的埠號是通過網路資料庫函式

getserverbyname()

確定的,這個函式返回的是關於網路服務方面的資料,它們和主機資料差不多。程式會先嘗試連線指定主機資訊資料庫裡的位址,如果成功就讀取

daytime

服務返回的資訊,該資訊是乙個表示

unix

時間和日期的字串。如果測試平台是

linux

桌面作業系統,修改「

/etc/xinetd.d/daytime

」檔案,將此檔案中兩個

disable

的值由yes

改為no

,再重啟計算機即可執行

daytime

服務。

4 3 2 主機名稱驗證

網際網路上的主機名稱一般由單詞字元和字元.組成,如myhost.com wname.net 123.cn等。主機名稱被字元.分割,被分割的每乙個字串由單詞字元組成,但是字元 不能是該字串的第乙個字元或者最後乙個字元。另外,被分割後的每乙個字串最大長度為63 最小長度為1。以下正規表示式能夠驗證被分割...

HP UNIX 修改主機名稱

今天網上看到修改hp unix主機名稱文章,借來分享下,權當借花獻佛了。hp ux修改主機ip位址 方法一1.set parms hostname 2.set parms address 3.修改 etc hosts檔案 注意 上面的方法實際修改了 etc rc.config.d netconf,重...

Centos 修改主機名稱

centos 配置主機名稱 1.首先查詢一下當前的主機名稱 root localhost hostnamectl status static hostname 永久主機名 pretty hostname 臨時主機名 icon name computer server chassis server m...