0

ブラウザとイカのプロキシ間で実行される小さな HTTP プロキシを構築しています。ブラウザは HTTP リクエストをプロキシに送信し、プロキシはそれを squid プロキシにリダイレクトします。その後、アプリケーションは squid プロキシから応答を取得し、それをブラウザに返します。

問題は、プロキシから完全な応答を取得できないことです。HTTP 200 OK ... (応答ヘッダーのみ) を取得しますが、本文がない場合は、もう一度受信メソッドを呼び出して本文を取得する必要があります。しかし、コードをデバッグすると (アプリケーションが遅くなります)、すべての応答 (応答ヘッダーと本文) が得られます。ここに私のコードがあります:

static void Main(string[] args)
    {
        int ServerPort = 8888;
        IPAddress localHost = new IPAddress(0x0100007f);
        TcpListener listener = new TcpListener(localHost,ServerPort);
        listener.Start();
        while(true)
        {
            string requestString = "";
            String respenseString = "";
            TcpClient application = listener.AcceptTcpClient();
            string source = application.Client.RemoteEndPoint.ToString();
            byte[] dataFromApp = new byte[application.ReceiveBufferSize];
            application.Client.Receive(dataFromApp);                
            TcpClient tunnel = new TcpClient("127.0.0.1",8080);
            tunnel.Client.Send(dataFromApp);                
            while (tunnel.Client.Connected ==true)
            {
                if(tunnel.Available != 0)
                {                        
                    byte[] responseFromProxy = new byte[tunnel.ReceiveBufferSize];
                    tunnel.Client.Receive(responseFromProxy);
                    respenseString += Encoding.UTF8.GetString(responseFromProxy);
                }
                else
                {                        
                    break;
                }
            }                
            application.Client.Send(Encoding.UTF8.GetBytes(respenseString));
        }
4

3 に答える 3

1

と の戻り値を確認する必要がtunnel.Client.Receiveありapplication.Client.Receiveます。受信はdataFromApp.Lengthバイトを読み取ることを保証しません

備考: Receive メソッドはデータを buffer パラメータに読み込み、正常に読み込まれたバイト数を返します。

PS: FiddlerCoreを試して Http Proxy を作成することもできます。

于 2012-11-15T10:31:08.427 に答える
0

TCP ソケットはストリーミングであるため、ソケットには「このメッセージには N バイトが残っています」というプロパティはありません。メッセージではなく、バイトを送受信します。

HTTP はメッセージを定義します。HTTP プロキシを実装する場合は、HTTP 1.1 RFCに精通している必要があります。HTTP メッセージの長さを判断するにはさまざまな方法があります。HTTP メッセージを正常に送受信できるようにするには、これらすべてを実装する必要があります。

于 2012-11-15T10:42:13.307 に答える
-1

みんなありがとう

私はそれをやった:

while (tunnel.Client.Receive(oneByte) != 0)
{
  byte[] responseFromProxy = new byte[tunnel.Available];
  tunnel.Client.Receive(responseFromProxy);
  application.Client.Send(oneByte);
  application.Client.Send(responseFromProxy);
}
于 2012-11-16T16:01:11.390 に答える