【发布时间】:2020-04-04 22:17:59
【问题描述】:
为了了解 Haskell 中网络通信的工作原理,我正在实现一个类似 echo 的简单 UDP 服务器。 它应该通过本地主机(端口 7331)上的 IPv6 进行侦听,接收消息并将它们与另一个字符串连接起来回显给发送者。
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Network.Socket hiding (send, sendTo, recv, recvFrom)
import Network.Socket.ByteString
import Control.Concurrent
import Control.Exception
import Control.Monad (forever)
import System.IO (
IOMode (ReadWriteMode)
, hPutStrLn
)
import qualified Data.ByteString as BS
main = do
sock <- socket AF_INET6 Datagram defaultProtocol
let hints = defaultHints { addrFamily = AF_INET6, addrSocketType = Datagram}
serverAddr <- addrAddress . head <$> getAddrInfo (Just hints) (Just "::1") (Just "7331")
print serverAddr
bind sock serverAddr
print sock
forever $ do
receivedStuff <- recvFrom sock 65535 -- blocks
forkIO $ bracket newSendSocket close (serveReceive receivedStuff)
serveReceive :: (BS.ByteString, SockAddr) -> Socket -> IO ()
serveReceive (msg, fromAddr) sendSocket = do
putStrLn $ "Got message " ++ show msg ++ " from " ++ show fromAddr
sendTo sendSocket ("Hi, thx for " `BS.append` msg) fromAddr
putStrLn "sent response"
return ()
newSendSocket :: IO Socket
newSendSocket = socket AF_INET6 Datagram defaultProtocol
我正在使用 netcat 测试服务器的功能:nc -u -6 "localhost" 7331
服务器接收消息并能够将它们放入标准输出。但响应从未出现在 netcat 中。
知道我在这里做错了什么吗?据我所知,在使用 sendTo 发送数据之前,不需要绑定数据报套接字 (bind) 或 connected。
【问题讨论】: