我开发了一个名为
PortFusion的分布式反向代理.它的最初目标是通过防火墙建立长时间,最小开销,高吞吐量的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
问题:
在上面的网络设置中,我检查套接字的Connected属性,例如一个Hx从Firefox @Ax:1001接受的属性,将闭包传播到Cu用来与Squid通信的相应镜像套接字.
但他们总是保持联系!
>为什么Firefox套接字始终保持连接?
>一旦获得响应,Firefox不负责关闭它为HTTP请求打开的套接字吗?
>我是否还有其他外部触发器,我可以感知并用于关闭套接字?
关于公认答案的信息
使用套接字的Connected属性是错误的.按照接受的答案提示,我读了this post和MSDN article.
在下面显示的更改之后,一旦请求完全响应并且闭包传播按预期正常工作,现在两端立即得到通知. (过去有一种不同的机制可以最终清除非活动套接字,但速度不够快.)
代码(F#)之前:
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
其中read包含对Socket.Receive的调用并设置lengthR.
最佳答案 ‘connected’属性指的是套接字,而不是连接.连接没有连接状态.它们是连接的,直到您在阅读时获得EOS,或在阅读或写入时获得错误.您应该传播的是EOS条件.您可以通过关闭下游套接字的输出在代理中执行此操作.您正在使用的代理基础产品应该已经完成了所有这些.