使用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);inet_ntoa和inet_aton不支援ipv6, 據說遲早要廢除,不過目前來說,很多系統都可以看見這兩個函式int inet_pton(int af, const char *src, void *dst); /* presentation format to network */
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 函式的傳入值是網域名稱或者主機名...