2016-05-11 8 views
0

私はソケットを事前に作成して(ソケット()BSD API経由で)動作するコードをいくつか持っています。 connect()など。これはIPv4で動作しますが、今はIPv6をサポートするためにリファクタリングしています。ソケットがIPv4かIPv6かを知らずにあらかじめ作成しています

問題は、私が最初のsocket()を実行するときに、AF_INETまたはAF_INET6を入れる必要があるということです。しかし、私はまだ住所を知らないので、どちらが正しいかわからない。いずれにしても動作する汎用ソケットを作成するにはどうしますか? AF_INET6を使用していて、IPv4ネットワーク上にある場合、動作しないと仮定して正しいのですか?

関連する質問 - 私はまだIPアドレスを知らないにもかかわらず、自分のデバイスがどのネットワーク上にあるかを知ることができますか:IPv4かIPv6? 1つのネットワークインターフェースを想定すると、私はこれらのネットワークのうちの1つしかできないと思うので、私のデバイスがどのタイプのネットワークに接続されているかを検出する方法を見つけることができれば、ソケットの作成時にそれを行うことができます。

もう一つの選択肢は、アドレスを知っているときだけソケットを作成するためにリファクタリングすることですが、大きなコードベースがあり、可能ならばそれを避けたいと思います。

私はiOS上で動作するコードを書いていますが、ここでそれが適切かどうかはわかりません。

+1

いくつかのプラットフォームは*デュアルスタック*ソケットをサポートしています(悲しいことに、iOSはその1つではありません。可能であれば、IPv6のための 'AF_INET6'ソケットを作成し、' IPv4-mapped IPv6 addresses '(https://en.wikipedia.org/wiki/IPv6#IPv4)経由でIPv4を許可するために 'IPV6_V6ONLY'オプションを無効にします-mapped_IPv6_addresses)。 –

答えて

5

あなたがしたいことはできません。ソケットが作成されるとスタックプロトコルに関連付けられ、IPV6とIPV4は異なるスタックプロトコルに過ぎません。

しかし、実際の質問はなぜあなたはソケットを事前に作成していますか?必要なときにソケットを作成してみませんか?

最後に、あなたの前提が間違っています。お使いのデバイスには、複数のインタフェース(IPv4用とIPv6用)を使用でき、両方を使用できます。

+2

正解、なぜ誰かがあなたに-1を与えた理由はありません... –

+0

@SanderSteffann、ええ、私も好奇心が強いです。 – SergeyA

+0

これは良い答えかもしれませんが(私は**落札しませんでした)、それがすべてを網羅しているかどうかはわかりません。プロトコルバインディングを待つことを許可する 'AF_UNSPEC'ソケットファミリーの使用はどうでしょうか? (私はIPv4とIPv6の両方に耳を傾けることができます)が、クライアントソケットにどのように適用されるか(または適用されないか)を説明するのが適切かもしれません。 – Myst

関連する問題