【问题标题】:Why doesn't this TCP server work?为什么这个 TCP 服务器不工作?
【发布时间】:2017-09-30 09:23:58
【问题描述】:

我写了这个简单的 tcp 服务器:

import Network
import Network.Socket.ByteString

main :: IO()
main = do
    sock <- listenOn $ PortNumber 2000
    contents <- recv sock 4096
    print contents

堆栈构建成功,所以我运行服务器,使用 telnet 测试它,但出现错误:

在 Linux 上:

Network.Socket.recvBuf:invalid argument (Transport endpoint is not connected)

在窗户上:

Network.Socket.recvBuf:failed(No error)

程序有什么问题?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    listenOn 只是创建一个“侦听套接字”,它“侦听”到您的服务器的新连接。您应该使用accept 函数来获取新客户端,如下所示:

    main :: IO ()
    main = do
        sock <- listenOn $ PortNumber 2000
        (client, _, _) <- accept sock
        contents <- hGetContents client
        print contents
        sClose sock
    

    或者使用底层的accept函数(来自Network.Socket模块)获取socket:

    main :: IO ()
    main = do
        sock <- listenOn $ PortNumber 2000
        (client, _) <- accept sock
        contents <- recv client 4096
        print contents
        sClose client
        sClose sock
    

    如果你想处理更多的客户,你可以像这样使用forkIO

    main :: IO ()
    main = do
        sock <- listenOn $ PortNumber 2000
        forever $ do
            (client, _) <- accept sock
            forkIO $ do
                contents <- recv client 4096
                print contents
                sClose client
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 2021-07-30
      • 2021-03-29
      相关资源
      最近更新 更多