gpt4 book ai didi

haskell - TCP服务器haskell字符串比较

转载 作者:行者123 更新时间:2023-12-02 16:26:08 25 4
gpt4 key购买 nike

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

最佳答案

我在这里发现了很多问题。

  • 您应该在 hPutStr h "connected" 之后刷新 Handle。 IIRC Handle 被缓冲。因此,可能一切正常,但由于缓冲,您在客户端看不到 connected 消息。 (添加:使用hFlush h)

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

关于haskell - TCP服务器haskell字符串比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25219130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com