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

您观察到连接打开了多长时间?

客户端很可能使用 HTTP 1.1,其中持久连接默认处于打开状态。

如果您正在编写代理,那么您应该考虑:http ://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html

于 2012-10-07T10:48:49.750 回答
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 回答