Gethostbynameは、IPv4アドレスでホステント構造を返すことが保証されていますか?
-
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は「各」アドレスの長さです。