2

私がgetaddrinfo()以下のように呼ぶとしましょう:

addrinfo hints;
addrinfo* res = NULL;

hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;

getaddrinfo(NULL, "http", &hints, &res);

現在、この結果にIPv4アドレスを含む複数の結果が含まれる可能性はありますか?私が考えることができる唯一の理由は、おそらく別々の接続を持つ複数のデバイスですが、プライマリ接続またはそれが使用する1つの接続のアドレスのみを返すことを半分期待しています。

4

2 に答える 2

6

はい。

getaddrinfoのmanページには、このトピックについて次のように書かれています。

リンクリストに複数のaddrinfo構造が含まれる理由はいくつかあります。たとえば、ネットワークホストがマルチホームであり、複数のプロトコル(AF_INETとAF_INET6の両方)からアクセスできます。または、同じサービスを複数のソケットタイプ(たとえば、1つのSOCK_STREAMアドレスと別のSOCK_DGRAMアドレス)から利用できます。通常、アプリケーションは、返される順序でアドレスを使用してみてください。getaddrinfo()内で使用されるソート関数は、RFC3484で定義されています。/etc/gai.conf(glibc 2.5以降で使用可能)を編集することにより、特定のシステムの順序を微調整できます。

于 2012-07-17T13:57:47.803 に答える
0

私もこの混乱を経験し、いくつかの調査を行いました。

Linuxプログラミングインターフェイスから引用

int getaddrinfo(const char * host , const char * service ,
const struct addrinfo * hints , struct addrinfo ** result );

結果の引数は、、、、および hostで指定された基準に対応するホストとサービスの複数の組み合わせが存在する可能性があるため、単一の構造ではなく、構造のリストを返します。たとえば、複数のネットワークインターフェイスを備えたホストに対して複数のアドレス構造を返すことができますservicehints

自分のドメインでテストしましたcopyqwer.com

DNS設定:

Type    Name        Value               TTL 
A       @           23.106.150.74       600 seconds 
A       @           111.222.17.173      600 seconds

そしてgetaddrinfo、これら2つの異なるIPアドレスを持つaddr構造を返します。

完全な例。https://onlinegdb.com/ry1cdoAKr

UDPコンピューターに出力する(ローカルコンピューターに出力がない理由はわかりませんが、それは問題ではありません)

/home/*****/CLionProjects/APUE/cmake-build-debug/APUE copyqwer.com http
flags canon family inet type stream protocol TCP
    host copyqwer.com address 111.222.17.173 port 80
flags canon family inet type stream protocol TCP
    host - address 23.106.150.74 port 80
于 2019-10-24T04:27:28.117 に答える