0

私は http プロキシ アプリケーションで作業しています。すべて正常に動作しています (クライアントはサーバーに接続してコンテンツを取得できます)。問題は、HTTP サーバーまたはブラウザーが TCP 接続を閉じることではありません。そうです、ここにコードがあります:

while (tcp_link.Connected && _tcp.Connected && !ioError)
{
  try
  {
      Thread.Sleep(100);
      if (streamLink.DataAvailable)
      {
          byte[] l_buffer = new byte[10000];
          int l_read = streamLink.Read(l_buffer, 0, l_buffer.Length);
          byte[] l_data = new byte[l_read];
          Array.Copy(l_buffer, l_data, l_data.Length);

          _stream.Write(l_data, 0, l_data.Length);
      }

      if (_stream.DataAvailable)
      {
          byte[] c_buffer = new byte[10500];
          int c_read = _stream.Read(c_buffer, 0, c_buffer.Length);
          byte[] c_data = new byte[c_read];
          Array.Copy(c_buffer, c_data, c_data.Length);

          streamLink.Write(c_data, 0, c_data.Length);
      }
  }
  catch
  {
      ioError = true;
  }
}

私は両側(プロキシクライアントとプロキシサーバー)で同じコードを持っています

注:ブラウザはプロキシクライアント(同じコンピュータ上にあります)に接続し、プロキシクライアントはプロキシサーバーに接続し、明らかにプロキシサーバーはhttpサーバーに接続します。理由は、データを送信する前にエンコードしたくないからです

4

2 に答える 2

1

さて、私は問題を見つけました.ソケット接続を閉じるのに問題がある人はいます..

実際にSocket.Availableは、期待どおりに動作していません。ソケットが実際に接続されているかどうかを確認するには、Available プロパティと Poll プロパティの両方を確認する必要があります。以下の関数で問題を解決できます: zendar のおかげです。

bool SocketConnected(Socket s)
{
      bool part1 = s.Poll(1000, SelectMode.SelectRead);
      bool part2 = (s.Available == 0);
      if (part1 & part2)
            return false;
      else
            return true;
}

これであなたの問題も解決することを願っています;)

于 2012-10-07T16:28:31.607 に答える
1

接続が開いているのをどれくらいの時間観察しましたか?

クライアントが永続接続がデフォルトでオンになっている HTTP 1.1 を使用している可能性が非常に高いです。

プロキシを作成している場合は、次のことを考慮する必要があります: http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html

于 2012-10-07T10:48:49.750 に答える