1

ホスト名の解決には使用できないためgetaddrinfo(...)、固執する必要がありますgethostbyname(...)

関数は、gethostbyname(...)成功時に IPv4 (AF_INET) アドレスのみを含む hostent 構造体を返すことが保証されているため、次のコードは常に 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;
}
4

2 に答える 2

2

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

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

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

編集

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

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

于 2010-05-06T18:50:47.033 に答える
2

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

于 2011-11-28T21:04:37.947 に答える