我正在编写代理,它将置于浏览器和网站之间的通信中间,并不关心HTTPS数据的内容,它只是将浏览器之间的所有内容翻译回来。
以下是可用的代码的一部分(流是NetworkStreams):
while(true)
{
using (MemoryStream ms = new MemoryStream())
{
do
{
int length = (tcpclientBrowser.Available > 0) ? (tcpclientBrowser.Available) : (0);
byte[] buff = new byte[length];
if (length != 0) streamBrowser.Read(buff, 0, length);
ms.Write(buff, 0, length);
} while (tcpclientBrowser.Available > 0);
byte[] dataRec = ms.ToArray();
if (dataRec.Length != 0) streamSite.Write(dataRec, 0, dataRec.Length);
}
using (MemoryStream ms = new MemoryStream())
{
do
{
int length = (tcpclientSite.Available > 0) ? (tcpclientSite.Available) : (0);
byte[] buff = new byte[length];
if (length != 0) streamSite.Read(buff, 0, length);
ms.Write(buff, 0, length);
} while (tcpclientSite.Available > 0);
byte[] dataRec = ms.ToArray();
if (dataRec.Length != 0) streamBrowser.Write(dataRec, 0, dataRec.Length);
}
}
基本上它只是读取浏览器流上的所有可用内容,将其发送到站点,读取站点流上的所有可用内容,将其发送到浏览器,非常简单。 但是它在同一个线程中工作,而不是并行工作,所以我想在while(true)之前创建单独的线程,将tcpclients和networkstreams传递到这个线程中并使while(true)在那里有一个do {}周期,就像这个(伪代码):
class Original {
CreateNewThread();
while(true) {
ReadFromBrowser();
SendToSite();
}
}
class NewThread {
while(true) {
ReadFromSite();
SendToBrowser();
}
}
我做到了,它就停止了工作。据我所知,线程内的streamSite.Read()只是不读取任何数据,即使已经将某些数据发送到网站。
我还检查了它是否会起作用,如果我只是在我刚创建的同一个线程中做{}' s它工作。
有一件事我注意到它在执行TLS握手时会挂起
不允许在单独的帖子中读取和写入浏览器和网站,或者在其他地方出错?