私はソケットを事前に作成して(ソケット()BSD API経由で)動作するコードをいくつか持っています。 connect()など。これはIPv4で動作しますが、今はIPv6をサポートするためにリファクタリングしています。ソケットがIPv4かIPv6かを知らずにあらかじめ作成しています
問題は、私が最初のsocket()を実行するときに、AF_INETまたはAF_INET6を入れる必要があるということです。しかし、私はまだ住所を知らないので、どちらが正しいかわからない。いずれにしても動作する汎用ソケットを作成するにはどうしますか? AF_INET6を使用していて、IPv4ネットワーク上にある場合、動作しないと仮定して正しいのですか?
関連する質問 - 私はまだIPアドレスを知らないにもかかわらず、自分のデバイスがどのネットワーク上にあるかを知ることができますか:IPv4かIPv6? 1つのネットワークインターフェースを想定すると、私はこれらのネットワークのうちの1つしかできないと思うので、私のデバイスがどのタイプのネットワークに接続されているかを検出する方法を見つけることができれば、ソケットの作成時にそれを行うことができます。
もう一つの選択肢は、アドレスを知っているときだけソケットを作成するためにリファクタリングすることですが、大きなコードベースがあり、可能ならばそれを避けたいと思います。
私はiOS上で動作するコードを書いていますが、ここでそれが適切かどうかはわかりません。
いくつかのプラットフォームは*デュアルスタック*ソケットをサポートしています(悲しいことに、iOSはその1つではありません。可能であれば、IPv6のための 'AF_INET6'ソケットを作成し、' IPv4-mapped IPv6 addresses '(https://en.wikipedia.org/wiki/IPv6#IPv4)経由でIPv4を許可するために 'IPV6_V6ONLY'オプションを無効にします-mapped_IPv6_addresses)。 –