1

我正在运行这个例子。它有效。但是,如果我运行另一个实例,我希望它会因异常而崩溃,但没有。预期的异常应该说类似“端口 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>"]
4

1 回答 1

2

发生这种情况是因为Data.Streaming.Networkscotty 使用的库(好吧,由 scotty 使用的 warp)获取了一个跨 IPv4 和 IPv6 的可能地址列表,然后尝试一次绑定到每个地址上的端口,丢弃任何IO 异常。

在端口 3000 上有两个 scotty 实例,我看到:

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

尝试第三个 scotty 实例,我看到:

% ./x
Setting phasers to stun... (port 3000) (ctrl-c to quit)
x: Network.Socket.bind: resource busy (Address already in use)
于 2018-05-11T21:53:30.163 回答