我有一个用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
答案 0 :(得分:5)
我在这里看到了很多问题。
您应该在Handle
之后刷新hPutStr h "connected"
。 IIRC Handle
被缓冲。所以一切都很好,但是由于缓冲,你在客户端看不到connected
消息。 (增加:使用hFlush h
)
有些客户(例如telnet
)使用\r\n
作为行尾标记,但hGetLine
期望\n
。因此,您可能会收到password\r
而不是password
。请尝试print msg
而不是putStrLn msg
,看看您收到了什么。