在未指定的情况下,Racket的servlet如何决定在哪个端口上运行?

时间:2018-11-19 23:23:21

标签: port racket

以下代码段打开了一个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服务器中的实际源代码,我想证实这一理论。

1 个答案:

答案 0 :(得分:2)

源代码中的相关行是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行。虽然我没有追溯此端口的传递位置,但我假设它最终是从tcp-listen提供给Racket的racket/tcp函数的,其中包括以下行in its documentation

  

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

我的猜测是操作系统确实执行了这种分配,但是我没有对此进行更深入的研究。