私はソケットコントロールを内蔵したライブラリを利用したiOSアプリケーションを持っています(言い換えれば、ソケットを自分で作成せず、ライブラリのパラメータをソケットに渡すだけです)。私はライブラリから利用可能な2つのAPIを持っています。それぞれのAPIには、IPv4またはIPv6の設定可能なアドレスが含まれています。次に、IPv6またはIPv4を使用する必要があるかどうかをライブラリに伝えるように設定できるトグルがあります。ここで iOS IPv6サポートを検出しました
は設定が
// IPv6 Configuration
char* ipv6_addr = . . .; // This is defined elsewhere
config.server.s6.sin6_family = AF_INET6;
config.server.s6.sin6_port = htons(1122);
inet_pton(AF_INET6, ipv6_addr, &(config.server.s6.sin6_addr));
// IPv4 Configuration
char* ipv4_addr = . . .; // This is defined elsewhere
config.server.s4.sin_family = AF_INET;
config.server.s4.sin_port = htons(1122);
inet_pton(AF_INET, ipv4_addr, &(config.server.s4.sin_addr));
config.use_ipv6 = 1; // Set to 0 to use IPv4
私は現在、正常IPv4またはIPv6のいずれかが依存に接続することができますをロードする方法の例が何であるかを、デバイスとクライアントネットワーク(ISPなど)のサポートが、私use_ipv6フラグを手動で設定する必要があります。
私がする必要があるのは、クライアントのネットワーク(ISPなど)がIPv6をサポートしているかどうかを確認することです。その場合は、IPv6接続を使用してください。ただし、そうでない場合は、IPv4接続を使用してください。好ましくは次のようなもの:config.use_ipv6 = has_ipv6_support();
ここで、関数has_ipv6_support()
は1
または0
のいずれかを返します。
したがって、ネットワークでIPv6がサポートされているかどうかを確認するにはどうすればよいですか。
ノート
a)のソケットは、ライブラリの内部で処理されるので、私は
getaddrinfo
の定期的な方法を使用することはできませんし、私はたくさんの周りIPのをシフト私のインフラ基盤のためにホスト名を使用することはできません。私は、私の処分でIPv4アドレスかIPv6アドレスのいずれかしか持っていません。b)これはC言語で書かれていますが、Objective Cでも解決しても構いません。
c)IPv6接続をテストして、接続にUDPを使用しているので、応答をタイムアウトする必要があるため、判断が難しいでしょう。これは私が関与したいと思っているよりも少し論理的です。なぜならこれは毎回やり直す必要があり、ネットワークアダプターを生かしてバッテリーを消したくないからです。私はこの情報をローカルに引き出すことができるようにしたいと思う。
通常、最良の答えは「IPv6を使用しようとしても動作しない場合はIPv4にすばやく戻ります」というオプションですか?また、NAT64の背後から作業する必要があります –
@SanderSteffannアプリケーションがUDPプロトコルを使用しているため、応答時にタイムアウトなしに接続をテストすることは困難です。 –