下面的代码片段打开一个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 但是我的球拍远没有达到标准杆,我不能对我在那里读到的东西做出正面或反面的判断。有人知道如何选择港口吗?
web-server/insta
谢谢!
编辑: 刚刚知道“短暂的港口”。
临时端口是一个短期的端点,当程序请求任何可用的用户端口时,操作系统会创建该端点。操作系统从预定义的范围(通常介于1024和65535之间)中选择端口号,并在相关TCP连接终止后释放端口。- VMware文档
所以,很可能Racket只是请求任何可用的端口,它是 操作系统 返回“临时港口”。不过,如果有人能指出Racket的Web服务器中发生这种情况的实际源代码,我想确认一下这个理论。
源代码中的相关行是 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 0
tcp-listen
racket/tcp
如果 port-no 是 0 套接字绑定到一个临时端口,可以通过调用 tcp-addresses .
port-no
0
tcp-addresses
我的猜测是操作系统确实执行了这个分配,但我没有比这更深入地挖掘。