Как сервлеты Racket решают, на каком порту работать, если не указан? - PullRequest
0 голосов
/ 20 ноября 2018

Следующий фрагмент открывает сервлет, но каждый раз на другом порту.

#lang web-server/insta

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

Документация объясняет, как указать номер порта, если это необходимо. Но мне любопытно, как web-server/insta решает, на каком порту работать, когда не указан . Я нашел источник на Github здесь , но моя Ракетка далеко не на высоте, и я не могу понять, что я читаю там. У кого-нибудь есть идеи как выбрать порт?

Спасибо!

Edit: Только что узнал про "эфемерные порты".

Эфемерный порт - это недолговечная конечная точка, которая создается операционной системой, когда программа запрашивает любой доступный пользовательский порт. Операционная система выбирает номер порта из предопределенного диапазона, обычно от 1024 до 65535, и освобождает порт после завершения соответствующего соединения TCP. - vmware docs

Так что вполне вероятно, что Racket просто запрашивает любой доступный порт, а операционная система возвращает "эфемерный порт". Тем не менее, я хотел бы подтвердить эту теорию, если кто-нибудь может указать мне фактический исходный код на веб-сервере Racket, где это происходит.

1 Ответ

0 голосов
/ 20 ноября 2018

Соответствующей строкой в ​​исходном коде является здесь , выдержка из которой следующая:

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

Обратите внимание на #:port 0линия.Хотя я не проследил, куда этот порт был передан, я предполагаю, что в конечном итоге он поступает в tcp-listen функцию Racket из racket/tcp, которая включает в себя следующую строку в своей документации :

Если port-no равно 0, сокет связывается с эфемерным портом, который можно определить, позвонив по номеру tcp-addresses.

Я предполагаю, что ОС выполняет это распределение, но я не копал глубже.

...