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

use*_*307 16 webserver tcp socat

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

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

socat TCP-LISTEN:8080,fork TCP:localhost:3000
Run Code Online (Sandbox Code Playgroud)

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

socat TCP-LISTEN:8080 TCP:localhost:3000
Run Code Online (Sandbox Code Playgroud)

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

为什么这个fork参数是必要的?没有它,为什么浏览器< - > Web服务器连接不能正常工作?

Cel*_*ada 30

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

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

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

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