c#Socket Closing

时间:2012-10-07 10:34:54

标签: c# sockets networking network-programming

我正在研究一个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服务器,原因是我之前不想编码数据发送出去

2 个答案:

答案 0 :(得分:1)

您发现连接打开的时间有多长?

客户端很可能使用默认情况下启用持久连接的HTTP 1.1。

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

答案 1 :(得分:1)

好的,我发现了问题,谁在那里关闭套接字连接有问题..

实际上,Socket.Available没有按照我的预期工作,看看套接字是否真正连接你应该检查可用和轮询属性,下面的函数应解决你的问题:thanks to: 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;
}

我希望这也能解决你的问题;)