5

TCPプロトコルでファイルを受信するアプリケーションを使用していますが、アプリケーションはファイルを処理してから同じプロトコルで送信します。問題なくファイルを受信して​​います。問題は、ファイルを送信しようとしたときです。動的ポートをリッスンしている別のアプリケーションにファイルを送信する必要があります。これらのファイルの送信に使用しているコードは次のとおりです。

internal void Send(byte[] buffer)
    {
        TcpClient _client = null;
        try
        {
            _client = new TcpClient(RemoteIPaddress, Dynamic_port);

            if (_client != null)
            {
                NetworkStream _clienttStream = _client.GetStream();
                _clienttStream.Write(buffer, 0, buffer.Length);
                _clienttStream.Flush();
                _clienttStream.Close();
                _clienttStream = null;
            }
        }
        catch 
        {
            if (_client != null)
            {
                _client.Close();
                _client = null;
            }
        }
    }

問題は、動的ポートを使用するリモートマシンにTCPプロトコルでファイルを送信するにはどうすればよいかということです。

4

2 に答える 2

2

通常、サーバーは既知のポートで接続要求をリッスンする必要があります。応答には、サーバーがさらに通信するポート番号が含まれている必要があります。次に、アプリはそのポートに接続してデータを転送します。

通信では、次のことを行う必要があります。

  1. クライアントは既知のポートでサーバーに接続します。
  2. サーバーは、以降の通信に使用する動的ポート番号で応答します。
  3. クライアントは、受信したポート番号でサーバーに接続します。
  4. サーバーは、接続が確立されたことを示す応答を返します。
  5. クライアントはデータを送信し、切断します。

これは、パッシブ FTP の仕組みを簡略化したものです。

ポイントは、動的ポートでサーバーに接続する方法は 2 つしかないということです。最初の方法は上で概説されています。そのようにできない場合、クライアント アプリはポート スキャンを実行し、範囲内のすべてのポートに接続試行を送信して、サーバーが応答するポートを確認する必要があります。ただし、ファイアウォールは通常、この種のことを認識してシャットダウンするようにプログラムされています (これはハッカーの動作です)。

于 2012-04-23T17:14:18.363 に答える
1

リモート マシンが使用するために選択した動的ポートをどのように判断できるかを尋ねていますか? これを自動化する方法はありません。サーバーは、両方のマシンが認識しているポートで動作するか、他の通信モードを介してポートを選択する方法を考え出す必要があります。サードパーティのサーバーに接続するか、クライアントがアクセスできる Web サービスをホストします。

于 2012-04-23T17:16:23.377 に答える