2012-03-07 173 views
11

我想了解浏览器和Web服务器之间的TCP连接。我有一台运行在本地机器上的web服务器,可以按照预期使用localhost:3000或127.0.0.1:3000浏览它。 (我正在运行“rails s”和WEBrick。)为什么socat在连接到Web服务器时需要“fork”?

我想在浏览器和Web服务器之间放置一个软件中介,于是开始尝试使用socat。以下工作就好了:

socat TCP-LISTEN:8080,fork TCP:localhost:3000 

我可以浏览到localhost:8080,事情按预期工作。但是,如果我省略这样的“,fork”参数,

socat TCP-LISTEN:8080 TCP:localhost:3000 

本地导轨网站在浏览器中显得很破碎。

为什么fork参数是必需的?为什么浏览器< - > Web服务器连接没有它的工作?

回答

23

如果没有forksocat将接受单个TCP连接,只要该连接保持打开状态,然后退出,就会在两个端点之间双向转发数据。你可以看到这个自己轻松:

  • 运行在socat一个终端窗口
  • 的Telnet在另一个终端窗口为localhost 8080。它连接到socat实例。
  • 在第三个终端窗口中Telnet到localhost 8080。您会收到拒绝连接的错误消息,因为socat不再监听新的连接:它已经开始维护已经获得的连接。
  • 在第二个终端窗口中键入HTTP请求。您将得到一个HTTP响应,然后socat将在连接关闭时退出。

fork选项只是让它分叉一个新的孩子来处理新接受的连接,而父母又回到等待新的连接。

socat的使用fork(),而不是像preforking或连接池更复杂的原因是你不想实现与socat高性能中间件!

+0

非常感谢Celada。这很有道理。 – user691307 2012-03-09 18:34:49

+0

我实际上想要做的是在浏览器和Web服务器之间编写我自己的“in-between”程序。它打开到Web服务器的客户端TCP连接,并在另一个端口上“侦听”TCP服务器。浏览器打开一个到监听端口的客户端连接。所以在一个浏览器端,有一系列打开和关闭的TCP会话序列。但在Web服务器端,只有一个建立的TCP连接。那失败了。我想我的自制软件中介可以在每次客户端启动和停止TCP连接时关闭并重新打开Web服务器连接。声音好吗? – user691307 2012-03-09 18:50:56

+0

听起来不错,也是最简单的事情。每次HTTP用户代理都会打开一个到服务器的新连接,并且同时关闭它们。与解释HTTP请求的内容相比,这样做的工作量要少得多,以确定何时可以调整内容,以便将来自客户端的多个连接聚合到一个连接到服务器的连接上。这种方式就是实现一个完整的HTTP代理服务器! – Celada 2012-03-10 15:46:05

相关问题