我有一个用 Haskell 编写的小型服务器,当我向它发送内容时,它应该评估发送的内容是否与 auth 函数中的密码“password”匹配,但它永远不是 True。
我可以看到发送的消息已通过,因为它打印在“putStrLn msg”处。
我尝试了几种方法,不同的功能,在 haskell 中使用“case of”,...。我不确定我做错了什么,它只是字符串比较不是吗?
提前致谢!
import Network
import Control.Concurrent
import System.IO
import Data.List
import Control.Monad
main :: IO ()
main = withSocketsDo $ do
sock <- listenOn $ PortNumber 4242
loop sock
loop :: Socket -> IO ()
loop sock = do
(h,_,_) <- accept sock
forkIO $ auth h
loop sock
auth :: Handle -> IO ()
auth h = do
msg <- hGetLine h
putStrLn msg
when (msg == "password") $ do
server h
server :: Handle -> IO ()
server h = do
hPutStr h "connected"
putStrLn "connected"
msg <- hGetLine h
putStrLn msg
hClose h
我在这里看到了很多问题。
你应该冲水Handle
after hPutStr h "connected"
。 IIRC 的Handle
被缓冲。所以可能一切都好,但你看不到connected
由于缓冲而在客户端发送消息。 (添加:使用hFlush h
)
一些客户(例如telnet
) uses \r\n
作为行尾标记,但是hGetLine
期望\n
。所以你可能会收到password\r
代替password
. Try print msg
代替putStrLn msg
查看您到底收到了什么。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)