为什么socat在连接到Web服务器时需要“fork”?

时间:2012-03-07 06:03:31

标签: tcp webserver socat

我正在尝试了解浏览器和Web服务器之间的tcp连接。我在我的本地计算机上运行了一个Web服务器,并且可以使用localhost:3000或127.0.0.1:3000按预期方式浏览到它。 (我正在运行“rails s”和WEBrick。)

我想在浏览器和Web服务器之间放置一个软件中介,因此开始尝试使用socat。以下工作正常:

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

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

socat TCP-LISTEN:8080 TCP:localhost:3000

本地rails网站在浏览器中看起来很破碎。

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

1 个答案:

答案 0 :(得分:26)

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

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

fork选项只是让它分叉一个新子进程来处理新接受的连接,而父进程则返回等待新连接。

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