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