2009-06-10 30 views
3

私はすべてがうまくいくWCFを使って通信するクライアント/サーバースタイルのアプリケーションを持っています。このアプリケーションの1つの機能は、クライアントマシンからサーバーにファイルを取得することです(中央制御)。TCPListenerを外部IPアドレスにバインドする方法はありますか?

セントラルコントロールは、クライアント上の指定されたフォルダにあるファイルのリストを要求し、クライアントが各ファイルに接続してストリームするためにソケットを使用してポートを開きます。各ファイルに異なるポート番号を使用します。

これはローカルでテストするときにうまくいきましたが、私の顧客環境にデプロイしたとき、私は次の例外を得るようになりました。

The requested address is not valid in its context 
    at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) 
    at System.Net.Sockets.Socket.Bind(EndPoint localEP) 
    at System.Net.Sockets.TcpListener.Start(Int32 backlog) 
    at System.Net.Sockets.TcpListener.Start() 
    at AMIGA.Library.TransferFile.listenerThread() 

エンドポイントのIPアドレスは10. です。。*アドレス。私は答えを探そうとしており、一般的な合意は、tcpListenerが外部IPアドレスとバインドできないということでした。私は考えていなかった10. 。*アドレスは外部であった。次のように

例外をスローするコードは次のとおりです。

tcpListener = New TcpListener(IEndPoint) 
Dim handlerSocket As Socket 
Dim thdHandler As Thread 
tcpListener.Start() 
RequestFile() 

は、私がこの仕事のためTcpListenerを使用することができます方法はありませんか?そうでない場合はどのような選択肢があり、どのように簡単に代替案を実装するのか。

私たちはファイアウォールの設定に直接アクセスすることはできず、変更には数週間かかることがあります。

+0

「外部」の定義はコンテキストによって大きく異なりますが、あなたが正しいです、10.0.0.1/8はプライベートサブネットとして指定されています。 –

答えて

2

アプリケーションは、マシンの内部IPアドレスにのみバインドする必要があります。問題は、ファイアウォールがポート転送を介して内部IPアドレスに外部IPアドレスを自動的に渡すことではないことです。選択した ポートを開くには、ルータにアプリケーション から

  1. 使用するUPnP(ユニバーサルプラグNプレイ)コマンド:あなたは簡単にファイアウォールの設定を変更することはできませんので、3つの選択肢があります。 より安全なファイアウォール構成ではUPnPが有効になりません。
  2. (より複雑)TCP Hole punchingを使用して、ファイアウォールを介して 接続を確立します。
  3. クライアントがサーバーに接続するようにセンスを変更します。サーバーはUPnPコマンドでポートを動的に開きます。または、このアプリケーションで使用するためにファイアウォール内にポートブロックを開いているだけです。

    いずれの場合も、WCF接続がセキュリティで保護されていることを確認してください。他の誰もポートスキャンでアクセスできず、許可なくファイルにアクセスできないようにしてください。

+0

ありがとうマイク、あなたは私たちに良い操縦をくれました。バインディングをLocalhostから中央コントロールの特定のネットワークアドレスに変更しました。それがトリックでした。 – Hooloovoo

0

この例外は通常、マシン上で有効でないアドレスにバインドしようとしているときに発生します。バインドしようとしているIPは、マシンのネットワークインターフェイスの1つに割り当てられていますか?

+0

接続はWCF(サービスモデル)を使用して行うことができ、Pingできますが、TcpListener.startメソッドが呼び出されたときに問題が発生します。 – Hooloovoo

+0

はい、TcpListenerのコンストラクタに渡すIPEndpointが、あなたのマシンで有効なIPEndpointであることを確認したかっただけです。それは、あなたのネットワークインターフェースの1つのIPかIPAddress.Anyでなければなりません。 – heavyd

関連する問題