2011-07-13 4 views
3

を使用して、私はおそらくここにどこかに答えた一般的な質問を持っていますが、検索を使用することは非常に生産的ではなかったです。だから、私は再確認し、それについてのスレッドがある場合は、そこに私を指摘してください。ありがとう。ピア・ツー・ピアのNATの背後にあるC#

したがって、一般的な考えは次のとおりです。 私たちには、サーバー全体のトラフィックをルーティングせずにお互いに話したい2つの.NET書込みクライアントがあります。さらに、両方のクライアントが.NETベースである必要はありませんが、いずれの場合もあります(別のものはObjective-C、UnixなどのC++でもかまいません)。

考え方は次のとおりです。

  1. NATは、クライアントがアドレス10.0.0.1:1234上にあり、サーバーがアドレス70.0.0.7:4567上にあることを覚えているように、第1のクライアントは、いくつかのサーバーへの接続を確立します。したがって、70.0.0.7がパケットをNATに送り返すと、NATはそれをクライアントにマスカレードする方法を知るでしょう。
  2. 第NATは、アドレス192.168.0.1:19234に内部クライアントがアドレス70.0.0.7:7654上のサーバに接続されていることを記憶し、他にもパケットをバック受け入れることができるようになりますので、第2のクライアントは、同じサーバーへの接続を確立192.168.0.1:19234
  3. 今、私たちは192.168.0.1:19234へ10.0.0.1:1234からの接続を作成する必要があります。

両方のC#クライアントは、それぞれのエンドポイントについて知ることができます(サーバーがNAT付きアドレスを保持していて、Client1 - 111.0.0.1:1111とClient2 - 222.0.0.2:2222)。 必要なことである - クライアント1がSocket.Connect拳を呼び出すことなく222.0.0.2:2222に直接パケットを送信することが可能とクライアント2のためにもSocket.Connectを呼び出すことなく111.0.0.1:1111にパケットを送信するために。

はようやくなどの標準的なソケットを使用して、特別なライブラリを使用せずに、.NETで行うことが可能ということですか?

+0

に似た何かをしたいような音 –

+0

@Tony The Tiger:ファイアウォールが接続を許可しないため。 NATは、レコード10.0.0.1:1234 <-> 111.0.0.1:1111をマスカレードしているが、それは111.0.0.1:1111 –

答えて

3

あなたはなぜあなたはSocket.Connectを呼び出すにしたくない?UDP hole punching

+0

ハズレにSocket.Connectを受け入れることができません。 UDPではなくTCP接続が必要です。私が見つけた最も類似したものはここです:http://www.mindcontrol.org/~hplus/nat-punch.htmlしかし、.NETで動作するかどうかを知る必要があります。または、おそらく、それは.NETでそれを行う方法でしょうか? –

+0

これを見てみると、われわれが望むものはまったく見つかりませんでしたが、おそらく、.NETラッパーをいくつかのライブラリに書き始めるのに十分なものが見つかりました。 –

1

それともNAT traversal

+0

実際には、「NAT Traversal」という用語を知った後、別のStackOverflowの記事を見つけることができました。 http://stackoverflow.com/questions/2443471/c-tcp-hole-punch-nat-traversal-library-or-somethingしかし、.NETで実装する方法についての良いガイドラインはありません。 –

+0

私は同じ方法で同僚の言葉を認めました:) – vines

関連する問題