【问题标题】:c# Socket Closingc# 套接字关闭
【发布时间】:2012-10-07 10:34:53
【问题描述】:

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

【问题讨论】:

  • 可以考虑用socket.Available初始化byte[]。这段代码不知道你想要什么

标签: c# sockets networking network-programming


【解决方案1】:

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

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

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

【讨论】:

  • 我使用了网络监控工具,当浏览器直接连接到http服务器时,收到数据后连接立即关闭,所以这意味着浏览器或http服务器会关闭连接,但是当浏览器连接到代理时客户端我无法从代理服务器端的 http 服务器检测到任何关闭请求
【解决方案2】:

好的,我找到了问题,谁有关闭套接字连接的问题..

实际上,Socket.Available 没有像我预期的那样工作,要查看套接字是否真的连接,您应该检查 Available 和 Poll 属性,下面的函数应该可以解决您的问题: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;
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2012-09-14
    相关资源
    最近更新 更多