Скотти не определяет, используется ли порт? - PullRequest
0 голосов
/ 12 мая 2018

Я бегу с этим примером.И это работает.Однако, если я запустил другой экземпляр, я ожидаю, что он аварийно завершит работу, но этого не произошло.Ожидаемое исключение должно выглядеть примерно так: «Порт 3000 уже используется», что является аналогичной ошибкой при запуске двух python -m SimpleHTTPServer 8000 в разных терминалах.

{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty

import Data.Monoid (mconcat)

main = scotty 3000 $
    get "/:word" $ do
        beam <- param "word"
        html $ mconcat ["<h1>Scotty, ", beam, " me up!</h1>"]

1 Ответ

0 голосов
/ 12 мая 2018

Это происходит потому, что библиотека Data.Streaming.Network, используемая Скотти (ну, например, warp, которая используется Скотти) получает список возможных адресов, который охватывает как IPv4, так и IPv6, а затем пытается подключиться к портам на каждом из этих адресов по одному.за один раз, отбрасывая любые исключения ввода-вывода.

С двумя экземплярами Скотти на порту 3000 я вижу:

% netstat -an | grep 3000
tcp46      0      0  *.3000                 *.*                    LISTEN
tcp4       0      0  *.3000                 *.*                    LISTEN

Попытка третьего экземпляра Скотти, который я вижу:

% ./x
Setting phasers to stun... (port 3000) (ctrl-c to quit)
x: Network.Socket.bind: resource busy (Address already in use)
...