2016-05-13 11 views
1

私はIPv4からIPv6へのコードの移行に取り組んでいます。もちろん、IPv4の下位互換性を維持する必要があります。IPv6アドレスはIPv4モードで動作しますか?

私はコードを変換するためのいくつかのドキュメントとガイドを読んでおり、inet_addr()の代わりにinet_pton()などの新しいAPIの多くを使用すると、IPv4とIPv6の両方で動作することが書かれています。

しかし、場合によっては、別の方法で各プロトコルを処理するためのコードを記述する必要があるとはっきりしない場合もあります。具体的には、IPv6アドレス(sockaddr_storage構造を使用するAF_INET6ファミリ)がローカルネットワーク上で動作するかどうかはわかりません。

したがって、たとえば、のは、私は一定のin6addr_loopbackに建てを使用してこのようなアドレスを作成し、私はバインド()の呼び出しにパラメータのためにそれを使用しようとしましょう。

これはIPv4とIPv6の両方で動作しますか、それぞれのケースに対して正しいアドレスタイプ(AF_INETとAF_INET6)を作成する必要がありますか?外部デバイスのソケットではなく、ローカルソケット(この場合はループバック)に接続するかどうかは重要ですか?

重要な場合に備えて、クライアントコードがiPhone/iPadハードウェア上で実行されています。

答えて

2

すべてのインターフェイスは、mac addressを使用してリンクローカルipv6アドレスを取得します。このアドレスは、ローカルネットワーク内の通信に十分です。 ソケットの作成に関しては、ファミリ(AF_INETとAF_INET6)を指定し、それを初期化してバインドする必要があります。

のIPv4:

 struct sockaddr_in serv_addr, cli_addr; 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = INADDR_ANY; 
    serv_addr.sin_port = htons(portno); 

    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) 

のIPv6:

 struct sockaddr_in6 serv_addr, cli_addr; 
    sockfd = socket(AF_INET6, SOCK_STREAM, 0); 
    serv_addr.sin6_family = AF_INET6; 
    serv_addr.sin6_addr = in6addr_any; 
    serv_addr.sin6_port = htons(portno); 

    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) 

は、このことができます願っています!

+0

私は両方のソケットの種類を作成する方法を知っていますが、私の質問は、常にすべてのシナリオでIPv6タイプを作成することです。これは、IPv4専用ネットワークを含むすべてのネットワークタイプで機能しますか?あなたのIPv6ホストは、IPv4接続用のIPv4トンネリングをしない限り – Locksleyu

+0

いいえ、あなたは、両方のプロトコルをサポートする必要があります。 – Pramod

+0

しかし、どのプロトコルを使用するのかはどのようにわかりますか?物事を単純にするために、私はローカルホストサーバーへの接続だけをしているとしましょう。 – Locksleyu

関連する問題