0

我正在尝试制作一个简单的 TCP 转发器作为 C# 中的练习。这是我用来将一个 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 ();
    }
}

但是,这似乎无法正常工作。好吧,我可以通过它远程登录,但是它

  1. 使用大量的 CPU
  2. 似乎不是 8 位干净的,因为它拒绝通过 HTTP 正确加载图像。

我将如何正确实现这样的功能?

4

2 回答 2

2

ReadByte()零是一个完全有效的字节......并且来自信号 EOF的负值:

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

(ETC)

但是,分块编写会更可取:

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

您没有退出循环。而且您一次读取一个字节。改用这个。

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