ben*_*y b 5 sockets networking haskell timeout
我正在尝试在 Haskell 中监听 UDP 数据报 3 秒钟。我写了一些代码,但我不确定为什么它不起作用。我将超时设置为 3 秒,但它只是永远等待并且不会阻塞
import Control.Concurrent as CC (forkIO, threadDelay, killThread)
import qualified Data.ByteString.Char8 as C
import Network.Socket
import Network.Socket.ByteString as B
import Data.IORef
import Control.Monad (forever)
import System.Timeout
receiveDatagram = do
ack <- newIORef (0 :: Int)
addrinfos <- getAddrInfo Nothing (Just "127.0.0.1") (Just "7001")
let serveraddr = head addrinfos
sock <- socket (addrFamily serveraddr) Datagram defaultProtocol
bind sock (addrAddress serveraddr)
print "starting"
tmp <- timeout 3000000 (do
(msg, addr) <- B.recvFrom sock 1024
close sock
writeIORef ack 1
print msg
)
case tmp of
Nothing -> close sock
_ -> print "something else"
print "timeout done"
Run Code Online (Sandbox Code Playgroud)
timeout
状态的文档:
像 hGetBuf、hPutBuf、Network.Socket.accept 或 hWaitForInput 这样的标准 I/O 函数似乎是阻塞的,但它们实际上不是,因为运行时系统使用像 select(2) 这样的调度机制来执行异步 I/O,所以它可以使用此组合器中断标准套接字 I/O 或文件 I/O。