Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在2x反向代理网络中,如何避免由于未关闭套接字而导致端口耗尽?_.net_Sockets_Proxy_Network Programming_Reverse Proxy - Fatal编程技术网

.net 在2x反向代理网络中,如何避免由于未关闭套接字而导致端口耗尽?

.net 在2x反向代理网络中,如何避免由于未关闭套接字而导致端口耗尽?,.net,sockets,proxy,network-programming,reverse-proxy,.net,Sockets,Proxy,Network Programming,Reverse Proxy,我正在开发一个分布式反向代理,名为。它最初的目标是通过防火墙建立长时间、最小开销、高吞吐量的TCP隧道,特别是对于RDP——很少的、长寿命的连接 不过现在,为了满足用户对安全性的需求和帮助活动家,我将其扩展到支持加密和支持大量短期连接 网络: Hu 1000 <============ Cx 1000 Au [ 1001 1001=Ax:1000 ^

我正在开发一个分布式反向代理,名为。它最初的目标是通过防火墙建立长时间、最小开销、高吞吐量的TCP隧道,特别是对于RDP——很少的、长寿命的连接

不过现在,为了满足用户对安全性的需求和帮助活动家,我将其扩展到支持加密和支持大量短期连接

网络:

          Hu 1000 <============ Cx 1000 Au
           [ 1001                  1001=Ax:1000
              ^                             |
              |                             |
              |                             |
              |                             v
          Cu 1001 Au                    Hx 1000
Squid <----- 1001=Au:3128                [ 1001 <----- Firefox

Legend:

  u  you
  x  person x

  A  address
  H  PortFusionHost
  [  hosted service
  C  PortFusionClient

  <  establish               bidirectional link
  =  encrypted, secure,      bidirectional link
  -  localhost-only, normal, bidirectional link

Notes:

  - Squid as a forward HTTP proxy
  - Connection between two parties (===) are secure and encrypted
  - Cu is in complete control of what services are shared with Hx
  - A single Hu and a single Cu can handle multiple persons x y z
            try
                request serverPort cl [||]
                while transmitting && socket.Connected do
                    if socket.Available = 0
                    then Thread.Sleep Wait
                    else let length = read()
                         LogFlow "<:>" "Read" serverPort "<-" client   length
                         request serverPort cl <| Array.sub   buffer 0 length
            with
            try
                request serverPort cl [||]
                while transmitting && read() > 0 do
                    let length = !lengthR
                    LogFlow "<:>" "Read" serverPort "<-" client   length
                    request serverPort cl <| Array.sub   buffer 0 length
            with
后面的代码:

          Hu 1000 <============ Cx 1000 Au
           [ 1001                  1001=Ax:1000
              ^                             |
              |                             |
              |                             |
              |                             v
          Cu 1001 Au                    Hx 1000
Squid <----- 1001=Au:3128                [ 1001 <----- Firefox

Legend:

  u  you
  x  person x

  A  address
  H  PortFusionHost
  [  hosted service
  C  PortFusionClient

  <  establish               bidirectional link
  =  encrypted, secure,      bidirectional link
  -  localhost-only, normal, bidirectional link

Notes:

  - Squid as a forward HTTP proxy
  - Connection between two parties (===) are secure and encrypted
  - Cu is in complete control of what services are shared with Hx
  - A single Hu and a single Cu can handle multiple persons x y z
            try
                request serverPort cl [||]
                while transmitting && socket.Connected do
                    if socket.Available = 0
                    then Thread.Sleep Wait
                    else let length = read()
                         LogFlow "<:>" "Read" serverPort "<-" client   length
                         request serverPort cl <| Array.sub   buffer 0 length
            with
            try
                request serverPort cl [||]
                while transmitting && read() > 0 do
                    let length = !lengthR
                    LogFlow "<:>" "Read" serverPort "<-" client   length
                    request serverPort cl <| Array.sub   buffer 0 length
            with
试试看
请求服务器端口cl[||]
传输时(&&read()>0 do)
让长度=!长度

LogFlow“”读取“serverPort”许多HTTP请求都是在启用了
保持活动状态的情况下完成的,因为您可能知道建立TCP连接需要花费大量时间。任何浏览器都可以这样做,而不仅仅是Firefox


如果套接字长时间处于打开状态,我不会感到惊讶,只要它们在Firefox关闭时关闭。它们是这样的,不是吗?

connected属性指的是套接字,而不是连接。CononActions没有连接状态。它们是连接的,直到您在读取时获得EOS,或者在读取或写入时出现错误。什么您应该在EOS条件下进行传播。您可以通过关闭下游套接字的输出在代理中进行传播。您正在使用的代理基础产品应该已经完成了所有这些工作。

是吗?嗯,让我检查一下。顺便说一句,面对保持活动状态,我如何处理端口耗尽问题?对于单个PC/机器,端口数不会超过2或3个(默认情况下)每个服务器/站点的连接都保持打开状态。通过这种方式很难接近限制-但如果有100个用户,显然要容易得多。HTTP代理将是控制它的一种方式;在发送响应后,您可以简单地终止连接。或者干脆不支持保持活动状态。这将迫使浏览器手动操作。PortFusion也被设计成不了解协议。我不想让不同的代码处理各种协议的不同行为而弄脏它。我可以让感兴趣的插件开发人员在绝对最坏的情况下使用钩子。不过,在这之前,我想先学习/找到并尝试解决方案不要只针对一个协议。感谢您提供有关“保持活力”
的提示!您关于“已连接”的性质的提示帮助我解决了问题!!我正在通过相关文章的链接更新问题,以及我做错了什么。