代码之家  ›  专栏  ›  技术社区  ›  Alex V

未指定时,Racket的servlet如何决定要在哪个端口上运行?

  •  2
  • Alex V  · 技术社区  · 7 年前

    下面的代码片段打开一个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 回复  |  直到 7 年前
        1
  •  2
  •   Alexis King    7 年前

    源代码中的相关行是 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_s tcp-listen 函数从 racket/tcp ,包括以下行 in its documentation :

    如果 port-no 是 0 套接字绑定到一个临时端口,可以通过调用 tcp-addresses .

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

    推荐文章