3

私は、すべてがうまく機能するWCFを使用して通信するクライアント/サーバースタイルのアプリケーションを持っています。アプリケーションの機能の 1 つは、クライアント マシンからサーバー (Central Control) にファイルを取得することです。

Central Control は、クライアントの指定されたフォルダー内のファイルのリストを要求し、ソケットを使用してポートを開き、クライアントが各ファイルに接続してストリーミングできるようにします。ファイルごとに異なるポート番号を使用します。

これは、ローカルでテストするときは問題なく機能しましたが、お客様の環境にデプロイすると、次の例外が発生し始めました。

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 を使用する方法はありませんか? そうでない場合、どのような代替案があり、代替案を実装するのはどれほど簡単でしょうか。

ファイアウォールの構成に直接アクセスすることはできず、変更が実装されるまでに数週間かかる可能性があることに注意してください.

4

2 に答える 2

2

アプリケーションは、マシンの内部 IP アドレスにのみバインドする必要があります。問題は、ファイアウォールがポート フォワーディングを介して外部 IP アドレスを内部 IP アドレスに自動的に渡さないことです。ファイアウォールの構成は簡単に変更できないため、次の 3 つの方法があります。

  1. アプリケーションからルーターへの UPnP (ユニバーサル プラグ アンド プレイ) コマンドを使用して、選択したポートを開きます。UPnP は、より安全なファイアウォール構成では有効になりません。

  2. (より複雑) TCP ホール パンチングを使用して、ファイアウォールを介した接続を確立します。

  3. クライアントがサーバーに接続するようにセンスを変更します。サーバーは、UPnP コマンドを介してポートを動的に開くか、このアプリケーションで使用するためにファイアウォールでポートのブロックを開きます。

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

于 2009-06-10T13:00:15.643 に答える
0

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

于 2009-06-10T12:49:08.927 に答える