2

我为 (Wai) 上的 (Warp) 编写了一个简单的 Hello World 应用程序。它在 Ubuntu Linux 中运行良好,更复杂的应用程序也是如此。但我什至无法让这个 Hello World 应用程序在 Windows 中运行。我在 Windows 7 Home Premium SP1 32 位上使用 Haskell 平台(安装文件 2012.2.0.0)。

这是代码(适用于 Linux):

{-# LANGUAGE OverloadedStrings #-} 

import Network
import Network.Wai
import Network.HTTP.Types (status200)
import Network.Wai.Handler.Warp (run)
-------------------------------------------------------------------------------
application = \_-> return $ responseLBS status200 [("Content-Type", "text/plain")] 
                            "Hello World" 

main = withSocketsDo $ do run 3000 application

这些是加载代码并运行(主要)时的 GHCI 消息:

Prelude> :l wai_hello_world.hs
[1 of 1] Compiling Main             ( wai_hello_world.hs, interpreted )
Ok, modules loaded: Main.
*Main> main
Loading package bytestring-0.9.2.1 ... linking ... done.
Loading package [ **edited**: blah blah blah - other packages - removed for readability]
Loading package warp-1.3.2 ... linking ... done.

加载代码后,Web 服务器似乎没有运行。

我想我可能会遇到一些常见的问题 - 如果是这样,请告诉我。

提前感谢所有反馈。

更新:正如下面的答案中所述,这些错误完全是由于 Ctrl-C 操作,杀死运行时,而不是问题中 Wai/Warp 的意外行为的一部分。

如果我按 Ctrl-C 几次以爆发,我会收到这些消息,或其中一些消息:

NIenttweorrrku.pStoecdk.e
t.ace*Main> p: failed (No error)
user error (accept: can't perform accept on socket ((AF_INET,Stream,0)) in status Closed)
user error (accept: can't perform accept on socket ((AF_INET,Stream,0)) in status Closed)
*Main>
*Main> user error (accept: can't perform accept on socket ((AF_INE,:Sream,0)) in status Closed)
q
Leaving GHCi.
4

2 回答 2

1

您可能需要使用withSocketsDo.

于 2012-12-06T13:13:53.653 回答
1

这解决了问题(我确实觉得很傻):

  1. 拆掉堆栈,卸载了适用于 Windows 的 Haskell Platform 2012.2.0.0。
  2. 为 Windows 安装了最新的 Haskell Platform 2012.4.0.0。
  3. 安装了包/库(cabal install yesod-platform)。
  4. 运行代码时批准了 GHC 上的 Windows 防火墙查询。
  5. 代码现在按预期运行。我现在没有问题。也许是防火墙。:-S
于 2012-12-07T06:50:08.203 回答