TCP服务器haskell字符串比较

时间:2014-08-09 13:35:56

标签: haskell

我有一个用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 

1 个答案:

答案 0 :(得分:5)

我在这里看到了很多问题。

  • 您应该在Handle之后刷新hPutStr h "connected"。 IIRC Handle被缓冲。所以一切都很好,但是由于缓冲,你在客户端看不到connected消息。 (增加:使用hFlush h

  • 有些客户(例如telnet)使用\r\n作为行尾标记,但hGetLine期望\n。因此,您可能会收到password\r而不是password。请尝试print msg而不是putStrLn msg,看看您收到了什么。