投稿に続き、C# で単純なプロキシを作成する方法は? 私は基本的なプロキシを実装して遊んでいます。
私が行き詰まって混乱しているWebRequest
のは、元の要求で提供された情報を使用して を発行しようとしていることです。
次のコードを使用します。
WebRequest webRequest = WebRequest.Create("http://www.google.com");
(webRequest as HttpWebRequest).UserAgent = "MOZILLA/5.0 (WINDOWS NT 6.1; WOW64) APPLEWEBKIT/537.1 (KHTML, LIKE GECKO) CHROME/21.0.1180.75 SAFARI/537.1";
webRequest.Method = "GET";
WebResponse webResponse = webRequest.GetResponse();
Stream responseStream = webResponse.GetResponseStream();
byte[] responseBytes = responseStream.ReadFully();
リクエストを正常に発行し、ページ コンテンツを返すことができます。
ただし、プロキシリクエスト (IE: ) の中に入れると、TcpListener
そのようになります。
TcpListener _listener = new TcpListener(IPAddress.Any, 1234);
this._listener.Start();
byte[] bytes = new byte[1024];
while (true)
{
TcpClient client = this._listener.AcceptTcpClient();
NetworkStream networkStream = client.GetStream();
int i = networkStream.Read(bytes, 0, bytes.Length);
while (i != 0)
{
string data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
RequestHeader header = new RequestHeader(data.ToUpper());
WebRequest webRequest = WebRequest.Create(header.URL);
(webRequest as HttpWebRequest).UserAgent = header.UserAgent;
webRequest.Method = "GET";
WebResponse webResponse = webRequest.GetResponse(); //It gets here and never returns
Stream responseStream = webResponse.GetResponseStream();
byte[] responseBytes = responseStream.ReadFully();
networkStream.Write(responseBytes, 0, responseBytes.Length);
i = networkStream.Read(bytes, 0, bytes.Length);
}
client.Close();
}
ラインでブロックし、WebResponse webResponse = webRequest.GetResponse();
決して戻りません。
これは、作成したクラスによって提供されるデータとは何の関係もありませんRequestHeader
。値のハードコーディングも試みたからです。
そのようなシナリオでソケットが機能する方法と必要なアプローチについて、何か基本的なことが欠けていると思います。うまくいけば、誰かが私のために明確にすることができます.