2017-08-04 9 views
0

私はソケットコントロールを内蔵したライブラリを利用した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を使用しているので、応答をタイムアウトする必要があるため、判断が難しいでしょう。これは私が関与したいと思っているよりも少し論理的です。なぜならこれは毎回やり直す必要があり、ネットワークアダプターを生かしてバッテリーを消したくないからです。私はこの情報をローカルに引き出すことができるようにしたいと思う。

+1

通常、最良の答えは「IPv6を使用しようとしても動作しない場合はIPv4にすばやく戻ります」というオプションですか?また、NAT64の背後から作業する必要があります –

+0

@SanderSteffannアプリケーションがUDPプロトコルを使用しているため、応答時にタイムアウトなしに接続をテストすることは困難です。 –

答えて

0

UDPサーバーとして、ライブラリはIPv4アドレスとIPv6アドレスの両方を同時に受信する必要があります。 IPv4とIPv6のどちらを使用できるかを知ることは絶対にないため、IPv4とIPv6を使用してリモートホストに定期的に接続する必要はありません。これは、IPv6またはIPv4パスのどこかで、アプリケーションと通信する可能性のあるリモート側にネットワーク障害が発生する可能性があるためです。だから、あなたのライブラリを変更するか(それは可能ではないようです)、または定期的に電池を交換してください!申し訳ありません:-(

関連する問題