c#插座闭合

c#插座闭合,c#,sockets,networking,network-programming,C#,Sockets,Networking,Network Programming,我正在开发一个http代理应用程序,一切正常(客户端可以连接到服务器并获取内容),问题是http服务器或浏览器都没有关闭TCP连接。。我不确定我是否做对了,下面是代码: while (tcp_link.Connected && _tcp.Connected && !ioError) { try { Thread.Sleep(100); if (streamLink.DataAvailable) { b

我正在开发一个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服务器,原因是我不想在发送数据之前对数据进行编码

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

客户端很可能使用HTTP 1.1,默认情况下,持久连接处于打开状态


如果您正在编写代理,那么您应该考虑:

好的,我发现了问题,有谁在关闭套接字连接时遇到过问题

实际上,
Socket.Available
并没有像我预期的那样工作,要查看套接字是否真正连接,您应该检查可用属性和轮询属性,下面的函数应该解决您的问题:


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

可以考虑用SOCKET初始化字节[]。这段代码没有给出您试图使用的网络监控实用程序的想法,当浏览器直接连接到http服务器时,连接在收到数据后立即关闭,因此这意味着浏览器或http服务器将关闭连接,但当浏览器连接到代理客户端时,我无法检测到来自代理服务器端http服务器的任何关闭请求
bool SocketConnected(Socket s)
{
      bool part1 = s.Poll(1000, SelectMode.SelectRead);
      bool part2 = (s.Available == 0);
      if (part1 & part2)
            return false;
      else
            return true;
}