使用hostent結構

2021-06-23 02:26:42 字數 2517 閱讀 6688

使用hostent結構:

#include

struct hostent

#define h_addr h_addr_list[0] //for backward compatibility 向後相容

struct hostent *gethostbyname(const char *name);

gethostbyname函式根據網域名稱解析出伺服器的ip位址,它返回乙個結構體struct hostent:

#include

#include

struct hostent *gethostbyname(const char *name);

struct hostent *gethostbyaddr(const void *addr,int len,int type)

這個函式的傳入值是網域名稱或者主機名,例如"www.baidu.cn"等等。傳出值是乙個hostent的結構,如果函式呼叫失敗,將返回null。

我們寫乙個程式來獲取主機www.163.com的詳細資訊:

#include #include #include #include #include #include #include #include #include #define servport 80

int main(int argc, char **argv)

printf("official name: %s\n\n", host->h_name);

printf("address length: %d bytes\n\n", host->h_length);

printf("host name alias: \n");

for (i = 0; host->h_aliases[i]; i++)

printf("\naddress list: \n");

for (i = 0; host->h_addr_list[i]; i++)

// 先清零,然後用struct sockaddr_in來填值

bzero(&serv_addr, sizeof(serv_addr));

serv_addr.sin_family = af_inet;

serv_addr.sin_port = htons(servport);

/* h_addr_list[i]指向in_addr型別 */

serv_addr.sin_addr = *((struct in_addr *)host->h_addr_list[i]);

const char *ip = inet_ntoa(serv_addr.sin_addr);

printf("connect to %s ", ip);

// 系統呼叫的時候,把sockaddr_in轉換成sockaddr

if (connect(sockfd, (struct sockaddr *)&serv_addr, \

sizeof(struct sockaddr)) == -1)

printf("success\n");

}return 0;

}

執行結果如下:

這個程式首先呼叫gethostbyname得到伺服器的各種資訊,其中就包含它擁有的ip位址,儲存在h_addr_list中,然後

對於h_addr_list中的每個ip位址,都呼叫connect連線其80埠。h_addr_list儲存的ip位址型別是char *,

struct sockaddr_in中sin_addr的型別是struct in_addr,而程式中卻直接把h_addr_list[i]強制轉換成struct in_addr *

serv_addr.sin_addr = *((struct in_addr *)host->h_addr_list[i]);

這是沒有問題的,因為h_addr_list儲存的並不是真正的字串,而是指向struct in_addr型別的指標。

另外,struct in_addr用來表示ip位址,本質上是乙個long型別,剛好4個位元組。然後我們呼叫inet_ntoa把它轉換

成可讀性更強的dots-and-number字串。關於ip位址和dots-and-number字串之間的轉換有4個函式:

#include /* network to ascii */

char *inet_ntoa(struct in_addr in);

/* ascii to network */

int inet_aton(const char *cp, struct in_addr *inp);

const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

int inet_pton(int af, const char *src, void *dst); /* presentation format to network */

inet_ntoa和inet_aton不支援ipv6, 據說遲早要廢除,不過目前來說,很多系統都可以看見這兩個函式

hostent結構介紹

這個資料結構是這樣的 struct hostent gethostbyname 成 功時返回乙個指向結構體 hostent 的指標,或者 是個空 null 指標。這裡是個例子 include include include int main void printf s n h h name prin...

hostent和in addr結構體

一.hostent資料結構是這樣的 struct hostent typedef uint32 t in addr t struct in addr 這裡是這個資料結構的詳細資料 struct hostent h name 位址的正式名稱。h aliases 空位元組 位址的預備名稱的指標。h ad...

如何列印hostent結構體中的所有資料

問題 hostent是gethostbyname 和gethostbyaddr 都會涉及到的乙個結構體。如下 struct hostent gethostbyname 的原型是 struct hostent gethostbyname const char name 函式的傳入值是網域名稱或者主機名...