0

C# での演習として、単純な TCP フォワーダーを作成しようとしています。これは、ある TCP ストリームを別の TCP ストリームに転送するために使用している関数です。

public static void forward (NetworkStream stm1, NetworkStream stm2)
{
    new Thread (new ThreadStart(() =>{
    try{
        while (true) {
            int a = stm1.ReadByte ();
            if (a > 0) stm2.WriteByte ((byte)a);
        }
    }catch{
            stm1.Close();
            stm2.Close();
        }
    })).Start ();
    try {
        while (true) {
            int a = stm2.ReadByte ();
            if (a > 0)
                stm1.WriteByte ((byte)a);
        }
    } catch {
        stm1.Close ();
        stm2.Close ();
    }
}

ただし、これは正しく機能していないようです。まあ、私はそれを通して物事をtelnetすることができますが、

  1. 恐ろしい量の CPU を使用します
  2. HTTP経由で画像を適切にロードすることを拒否するため、8ビットクリーンではないようです.

そのような機能を適切に実装するにはどうすればよいですか?

4

2 に答える 2

2

ゼロは完全に有効なバイトです...そしてReadByte()シグナル EOF からの負の値:

int a = stm2.ReadByte();
if (a < 0) break;
stm1.WriteByte ((byte)a);

(等)

ただし、チャンクで書き込む方がはるかに望ましいでしょう。

stm2.CopyTo(stm1);
于 2013-06-25T13:07:41.493 に答える
1

ループを終了していません。そして、あなたは一度に1バイトを読んでいます。代わりにこれを使用してください。

stm1.CopyTo(stm2);
于 2013-06-25T12:46:22.517 に答える