scotty没有检测到端口是否已被使用?

时间:2018-05-11 21:26:08

标签: haskell scotty

我正在运行这个例子。它有效。但是,如果我运行另一个实例,我预计它会因异常而崩溃,但是没有。预期的异常应该说"端口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 :(得分:2)

这是因为scotty使用的Data.Streaming.Network库(通过warp,scotty使用)获取了一个可能的地址列表,这些地址跨越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)