haskell - 为什么这个 TCP 服务器不工作?

标签 haskell

我写了这个简单的 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)

在 Windows 上:

Network.Socket.recvBuf:failed(No error)

程序出了什么问题?

最佳答案

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

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

或者使用低级的accept函数(来自Network.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

关于haskell - 为什么这个 TCP 服务器不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46501427/

相关文章:

Haskell:TVar 是如何工作的?

haskell - Haskell列表生成器中的生成器不起作用

haskell - where block 的语法

haskell - 使用 OSX Mavericks GHC 安装和构建 GHC

haskell - 并发访问持久化数据库的规则是什么

haskell - 如何在 Yesod/Persistent 中正确使用 runDB

haskell - 替换 ByteString 中的换行符

使用变形的列表过滤器

javascript - GHCJS:如何使用 FFI 导入高阶 javascript 函数?

scala - 在scalaz中堆叠StateT