2011-06-06 11 views
1

このアプリケーションは、他のシステムが.net remotingを使用して接続するための独自のアドレスを公開します。私はそれがthis RFCごとにコロンで混乱した場合には、角括弧を追加.net remotingのためにuriにipv6アドレスにゾーンインデックスを含める(またはゾーンインデックスを含まない)方法

IPAddress[] IPList = Dns.GetHostEntry(Environment.MachineName).AddressList; 
string ipAddress = IPList[ipIndex].ToString(); 
if(ipAddress.contains(":")) 
{ 
    // ip6 address 
    url = "tcp://[" + ipAddress + "]:" + port + "/" + name; 
} 
else 
{ 
    url = "tcp://" + ipAddress + ":" + port + "/" + name; 
} 

:それはのようなもので、コンピュータのすべてのアドレスを取得します。私は問題がゾーンインデックスだと思う - ToString()返すfe80::a8e8:2b42:3c07:c04a%10 - %10ゾーンインデックスに注意してください。ゾーンインデックスをURLに入れることはできますか? thisによると、それらは問題を引き起こす?ゾーンインデックスが必要ですか? IPアドレスからuriをアセンブルする方がいいですか?

編集:私は、リンクローカルアドレス、ループバックおよびマルチキャストアドレスを無視するようにコードを変更し、有効なアドレスを見つけるための答えを1として

- これはWindows7の例では、これらを除外します。

IPList[ipIndex].IsIPv6LinkLocal || IPList[ipIndex].IsIPv6Multicast || IPAddress.IsLoopback(IPList[ipIndex]) 

私は今、誰かが実際のIPv6アドレス窓と、このソフトウェアを使用している場合、ゾーンインデックスまたは他の私が構築したURLが壊れるものとしてアドレスを報告しないことを想定しています。私はIPAddress、ポートなどを入力として使用できる既存の.net URLビルディングクラス、またはリモーティングクライアントをActivator.GetObjectで必要とされる文字列URLの代わりにIPAddressクラスに接続するためのより良い方法を望んでいましたこれは今のところできます。

+1

これは、IPv6アドレスを確認する良い方法ではありません。 IPAddressクラスには、IPv6アドレスを示すAddressFamily.InterNetworkV6を含むenumであるAddressFamilyプロパティが含まれています – blowdart

答えて

2

ゾーンインデックスは他のシステムに何の意味もありません。 (あなたのゾーンインデックス10は、その特定のネットワークで使用されているネットワークインターフェイスとプラットフォームに応じて、他のゾーンのインデックス25、eth0、en0などである可能性があります)さらに、link-localのアドレス彼らはfe80::で始まるので、彼らがローカルLAN上の他のマシンにアドバタイズされている場合にのみ使用できます)。

IPv6リンクローカルアドレスを宣伝しないことをお勧めします。それらをアドバタイズする必要がある場合は、特定のインターフェイスにのみアドバタイズし、ゾーンインデックスを残す方法があるかどうかを確認してください。他のシステムでは、リンクローカルアドレスは、受信した同じインタフェースからしか使用できないことを知る必要があります。

ネットワークにIPv6ルーターを追加して、アドレスをglobal unicastだけ使用することをお勧めします。

0

RFC 3986の読みから、私はが正しい出力がtcp://[fe80::a8e8:2b42:3c07:c04a%2510]:port/nameのようなものになると思います- あなたは%25として%をエンコードする必要があり、そうでなければ、あなたのゾーンインデックスをパーセントエンコードされた文字と見られています!一方、§3.2.2は言う:ここで提供

ABNF は、[RFC3513]で提供IPv6の リテラルアドレスのテキスト定義を翻訳したものです。この構文は、 IPv6スコープ付きアドレス指定ゾーン識別子をサポートしていません。

...ゾーンインデックスを持つURIが、読んでいる方法によっては、そのRFCに準拠していない可能性があります。

ETA:ああ、ここで私たちは行く、RFC 6874は、相互作用を説明する3986を更新します。はい、パーセント記号をエスケープする必要があります。

(私はURL parsing, manipulation, and formatting libraryを書いている途中ですが、現時点では、ゾーンのインデックスを扱う方法がちょっと残っています。仕様が少しクールで使い物にはならないのです...)