2013-12-18 45 views
8

我是網絡編程的新手。以下結構定義對我來說非常混亂。這裏h_addr_list是一個定義爲字符串數組,但它用於存儲in_addr結構數組。爲什麼它沒有定義爲struct in_addr **h_addr_list而不是char **h_addr_list爲什麼struct hostent中的h_addr_list是char **而不是struct in_addr **?

struct hostent 
{ 
    char *h_name;  /* Official domain name of host */ 
    char **h_aliases; /* Null-terminated array of domain names */ 
    int h_addrtype;  /* Host address type (AF_INET) */ 
    int h_length;  /* Length of an address, in bytes */ 
    char **h_addr_list;  /* Null-terminated array of in_addr structs */ 
}; 


struct in_addr 
{ 
    unsigned int s_addr; /* Network byte order (big-endian) */ 
}; 

回答

11

結構定義可以追溯到C支持void *(或void,或者原型)之前的時代。在那些日子裏,char *是'通用指針'。這解釋了網絡功能接口的一些奇怪之處。它也可以追溯到有許多不同網絡系統(IPX/SPX,SNA,TCP/IP等)的時代。現在,TCP/IP佔據統治地位,但即使是現在,您也可能會返回一組IPv4地址或一組IPv6地址,因此指定struct in_addrstruct in6_addr會導致問題。

意圖是你有一個指向適當結構類型的指針數組。現在,它將被編寫爲void **h_addr_list - 一組void *。但是當這個結構第一次被定義時,這個選項是不可用的,剩下的就是歷史了(如果你可以避免它的話,你不需要在接口被標準化後改變接口)。

2

當創建結構時,創建者不確定AF_INET是否會成爲獲勝地址類型。

如果h_addrtype不是AF_INET,該怎麼辦?然後h_addr_list將包含不是struct in_addr的地址。

現在,幾十年後,我們發現IPV4地址用完了。很快,struct inaddr將被IPV6地址替換得越來越多。

相關問題