Haskell套接字接收超时

时间:2014-09-13 10:15:20

标签: sockets haskell timeout

我正在为haskell中的Windows编写SNTP客户端。以下是引发Exception: mallocPlainForeignPtrBytes: size must be >= 0的代码段,即recv函数执行:

getResponse :: HostName -> IO (Maybe String)
getResponse server = withSocketsDo $ do
    s <- socket AF_INET Datagram defaultProtocol
    setRecvTimeout s waitingTime
    host <- getHostByName server
    let hostAddress = head $ hostAddresses $ host
    connect s (SockAddrInet sntpPort hostAddress)
    sendAll s requestPacket
    response <- timeout (-1) (recv s 1024)
    return $ BC.unpack <$> response 

主要问题是timeout并没有真正阻止套接字阻塞。另外setSocketOption对我无效,setRecvTimeout有效,但recv连接到无效服务器时会抛出异常。那么如何正确暂停recv

我不想用try-catch处理这个异常,因为它不是真正的功能方式,而且我确信必须有更简单和优雅的方法来实现它。

0 个答案:

没有答案