2013-12-18 12 views
8

私はネットワークプログラミングを初めて利用しています。以下の構造体の定義は私にとって非常に混乱しています。ここでh_addr_listは文字列配列として定義されていますが、配列in_addrの格納に使用されます。 char **h_addr_listではなく、struct in_addr **h_addr_listと定義されていませんでしたか?なぜ構造体hostentのh_addr_listがstruct in_addr **の代わりにchar **ですか?

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_addrまたはstruct in6_addrのいずれかを指定すると問題が発生します。

目的は、適切な構造タイプへのポインタの配列を持つということでした。今日では、void **h_addr_list - void *という配列が書かれています。しかし、このオプションは構造が最初に定義されたときには利用できませんでした。残りの部分は履歴です(避けることができれば標準化された後にインターフェースを変更しません)。

2

構造体が作成されたとき、作成者はAF_INETが勝者のアドレス型になるかどうか確信がありませんでした。

h_addrtypeがAF_INET以外の場合はどうなりますか?その後h_addr_listにはstruct in_addr以外のアドレスが含まれます。

今、数十年後、IPV4アドレスが不足していることがわかりました。まもなく、struct inaddrはますますIPV6アドレスに置き換えられます。

関連する問題