Gethostbynameは、IPv4アドレスでホステント構造を返すことが保証されていますか?

StackOverflow https://stackoverflow.com/questions/2783581

  •  03-10-2019
  •  | 
  •  

質問

使用できません getaddrinfo(...) ホスト名を解決するために、したがって、固執する必要があります gethostbyname(...)

それは gethostbyname(...) IPv4(AF_INET)のみを含むホステント構造を返すことが保証されている関数は、成功に関するアドレスです。これにより、次のコードは常にIPv4アドレスにつながります。

int resolve(const char *name, struct in_addr *addr) {

    struct hostent *he = gethostbyname(name);

    if (!he)
        return 1;

    memcpy(addr,he->h_addr_list[0],4);

    return 0;
}
役に立ちましたか?

解決

いいえ、 gethostbyname() IPv4(標準DOT)またはIPv6(標準コロン、またはおそらくドット)表記を返すことができます。 少なくともLinuxで. 。あなたはそれに対処する必要があります。 ITのさまざまな実装はIPv4のみを返すと思います(例: Php)、しかし、私が使用したすべてのCプラットフォームは両方を返すことができます。

アプリがIPv4のみである場合、ユーザーがリモートホストに接続するための適切なインターフェイスを持っていない場合、IPv6を扱ってエラーが発生していることを理解するのはそれほど難しくありません。たとえあなたのアプリが両方をサポートしていても、 ユーザーの ゲートウェイサポート?

3つ以上 . またはの存在 : ..そのIPv6。

編集

h_addr の同義語です h_addrlist_[0], 、 その間 h_length すべてのアドレスの長さです。

おそらく私はあなたの質問を十分に理解していませんか?

他のヒント

H_ADDRTYPEは、H_ADDR_LISTにIPv4またはIPv6または他のタイプのアドレスが含まれているかどうかを示します。スイッチを使用して行を変更できます:memcpy(addr、he-> h_addr_list [0]、4); memcpy(addr、he-> h_addr_list [0]、n);ここで、nはアドレスタイプに必要な長さです。 MSDNドキュメントごとに、h_lengthは「各」アドレスの長さです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top