IPv6接続とIPv4接続の両方をリッスンするサーバーアプリケーションを作成しようとしています。これを実現する適切な方法は、IPv4接続も受け入れるIPv6アドレスをリッスンしているようです。
関連するコードは次のとおりです。
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
getaddrinfo(NULL, MYPORT, &hints, &res);
(Beejのガイドからほとんどコピーペーストされています)
問題は、少なくとも私のシステムでは、 1番目と2番目getaddrinfo
のエントリを返すのに対し、仕様に従って、クライアントが最初に返すことです。私の素朴なアプローチでは、サーバーはIPv4を選択し、クライアントはIPv6を選択し、接続は失敗します。AF_INET
AF_INET6
getaddrinfo
AF_INET6
を設定してこれを修正しようとしましhints.ai_family = AF_INET6
たが、IPv6が利用できないシステムでは失敗します。
私は2つの明白な解決策を見ています:
a)最初にIPv6を要求し、それが失敗した場合はIPv4にフォールバックするか、
b)の結果をウォークスルーしgetaddrinfo
、IPv6を探し、存在しない場合は最初のエントリを選択し
ますが、私は好きではありませんどちらかが多すぎる;)getaddrinfo
正しいことをするように説得する方法、またはおそらく私の目標を達成するための別の方法があるべきだと私は感じています。