我正在为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处理这个异常,因为它不是真正的功能方式,而且我确信必须有更简单和优雅的方法来实现它。