【问题标题】:How do Racket's servlets decide what port to run on when unspecified?当未指定时,Racket 的 servlet 如何决定在哪个端口上运行?
【发布时间】:2018-11-21 21:04:38
【问题描述】:

下面的 sn -p 打开一个 servlet,但每次都在不同的端口上。

#lang web-server/insta

(define (start req)
  (response/xexpr
   `(html (head (title "Hello world!"))
          (body (p "Hey out there!")))))

documentation 解释了如何指定端口号(如果需要)。但我很好奇web-server/insta 如何在未指定 时决定在哪个端口上运行。我在 Github here 上找到了源代码,但我的球拍远不及标准,我无法确定我在那里阅读的内容。有人知道如何选择端口吗?

谢谢!

编辑: 刚刚了解了“临时端口”。

临时端口是在程序请求任何可用用户端口时由操作系统创建的短期端点。操作系统从预定义的范围内选择端口号,通常在 1024 和 65535 之间,并在相关 TCP 连接终止后释放端口。 - vmware 文档

因此,Racket 很可能只是请求任何可用端口,而 操作系统 返回一个“临时端口”。不过,如果有人能指出发生这种情况的 Racket 的 Web 服务器中的实际源代码,我想证实这一理论。

【问题讨论】:

  • 附带说明:链接的源代码中的几行似乎表明默认情况下web-server/insta 尝试在端口 80 上打开(如果可用)。但即使在我停止 Apache 以释放端口 80 之后,web-server/insta 仍然会抓取随机的、高编号的端口。非常好奇幕后是怎么回事,急切希望获得洞察力!

标签: port racket


【解决方案1】:

源码中的相关行是here,以下为摘录:

(serve/servlet (contract (request? . -> . can-be-response?) #,start
                         'you 'web-server
                         "start"
                         #f)
               #:port 0
               #:extra-files-paths (if extra-files-path (list extra-files-path) empty)
               #:launch-browser? launch-browser?)

注意#:port 0 行。虽然我没有追溯这个端口被传递到哪里,但我认为它最终会从racket/tcp 提供给Racket 的tcp-listen 函数,其中包括以下行in its documentation

如果 port-no0,则套接字绑定到一个临时端口,这可以通过调用 tcp-addresses 来确定。

我的猜测是操作系统确实执行了这个分配,但我没有深入挖掘。

【讨论】:

猜你喜欢
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 2020-02-03
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多