スコープIDをサポートしていません。 (これにはMacOS X例えば、スコープIDは、第2の16ビットワードとしてリンクローカルアドレスのアドレス自体に埋め込まれる。 FreeBSD Handbookを参照し、「8.1.1.3スコープインデックス」(引用符は不要)を検索してください。
は、したがって、これらのプラットフォームでは、次のようにinet_pton()
は、文字列を変換し、そのINTF1は、スコープID 1を持っており、INTF2は、スコープID 2を持っていると仮定すると:
"fe80::1234%intf1" -> fe80:1::1234
"fe80::1234%intf2" -> fe80:2::1234
"fe80::1234" -> fe80::1234
最後のアドレスは、単に、スコープ外であるため、実際に使用することはできませんデータを送信する。
これは標準ではありません。 inet_pton()
は、LinuxまたはWindowsベースのシステムではそのように動作しません。しかし、私はLinuxとWindowsベースのシステムでも、inet_pton()
は最後にスコープIDを許可していると考えていますが、単に無視するだけです。
リンクローカルでないアドレスの場合、このトリックは機能しませんが、これらのアドレスは通常スコープではありません。スコープを設定できますが、通常はすべてのインターフェイスにインターフェイス識別子に基づいた独自のインターフェイスのIPv6アドレスがあります(DHCPv6を使用している場合でも、DHCPサーバーによってDHCPアドレスが割り当てられ、自動生成されますこの自動生成が禁止されていない限り、IPv6インタフェースアドレス)。
構造体にはスコープIDのフィールドがありますが、このフィールド(RFC 2553 - Section 3.3)を定義するRFCでは、このフィールドの解釈方法についてはあまり詳しく説明していません。それだけの言葉:
をsin6_scope_idはマッピングインターフェイスまたはインターフェイスのセットに が サイト識別子をテーマに実施し、将来の仕様に任されています。
したがって、このフィールドは完全に実装固有です。
このフィールドを正しく入力することにしたい、とあなたのコードは、できるだけクロスプラットフォームにする必要がある場合は、あなたがgetaddrinfo()
を使用する必要があります。
struct addrinfo hints;
struct addrinfo * result;
memset(&hints, 0, sizeof(hints));
// AI_NUMERICHOST prevents usage of DNS servers,
// it tells getaddrinfo that the input string is a numeric IP address.
hints.flags = AI_NUMERICHOST;
if (getaddrinfo("fe80::1234%intf1", NULL, &hints, &result) == 0) {
// result->ai_addr claims to be a pointer to struct sockaddr,
// in fact it will be a pointer to a struct sockaddr_in6 in our case.
struct sockaddr_in6 * so = (struct sockaddr_in6 *)result->ai_addr;
// It will be prefilled like this:
//
// so->sin6_family ==> AF_INET6;
// so->sin6_port ==> 0
// so->sin6_flowinfo ==> 0
// so->sin6_addr ==> fe80::1234
// so->sin6_scope_id ==> "intf1" as scope ID
// Do something with that sockaddr,
// e.g. set a port number and connect a socket to that address.
freeaddrinfo(result);
}
つの余分なヒント:あなたは返さを使用したい場合getaddrinfo()
は、サーバソケット(ローカルにバインドし、それにaccept()
を呼び出したいソケット)のために、あなたは受動的なフラグをも設定する必要があります。
hints.flags = AI_NUMERICHOST | AI_PASSIVE;
ない、それはほとんどの場合に役割を果たしますが、それがあること正しい方法getaddrinfo()
を使用してください。
、それはスコープIDが数値であることを前提としてい。 %1または%2は有効なスコープIDですが、その意味は実装によって異なります。スコープIDには、%dc0、%eth0、%en0などのインタフェース名を使用することもできます。正しいスコープIDを取得する方法については、インターフェイス名であっても、返信を参照してください。 – Mecki