查詢主機名稱是通過訪問主機資料庫實現的,伺服器資料庫介面函式在標頭檔案
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...