我试图在使用Network.Socket
模块构建的套接字上设置接收超时。这里有一个代码片段:在OSX上设置套接字选项
import Network.Socket
host = "127.0.0.1"
port = PortNumber 3000
main = do
addrinfos <- getAddrInfo Nothing (Just host) (Just port)
let serveraddr = head addrinfos
sock <- socket (addrFamily serveraddr) Stream defaultProtocol
setSocketOption sock RecvTimeOut 120000000
connect sock (addrAddress serveraddr)
msg <- recv sock 1024
putStrLn msg
sClose sock
的setSocketOption
行抛出异常:
*** Exception: setSocketOption: invalid argument (Invalid argument)
setSocketOption
只接受Int
论据设置,但不是所有的插座选择想要的Int
。具体RecvTimeOut
和SendTimeOut
预计struct timeval
。是否有另一种方法来设置哈斯克尔这些选项?
我在OSX运行GHC 7.4.2 10.8.1
编辑:
Network.Socket.Options
似乎是最好的解决方案在这里,并得到它来编译OSX上横空出世只是要求小拉请求。从版本0.2.0.1开始,network-socket-options现在可以在OSX上编译。
编辑2: 没有运气与Network.Socket.Options
。 setRecvTimeout
函数似乎对OSX没有任何影响。我最终使用System.Timeout
软件包中的timeout
作为解决方法。
msg <- timeout 120000000 $ recv sock 1024
这是否帮助:HTTP:// WWW。 haskell.org/pipermail/haskell/2005-October/016586.html?或者这个:http://hackage.haskell.org/packages/archive/network-socket-options/0.2/doc/html/Network-Socket-Options.html? – paulsm4
在Mac OS X和Linux上,GHC使用不受套接字超时影响的非阻塞套接字I/O。使用'System.Timeout'是超时I/O操作的正确方法。不幸的是,[网络I/O当前不能在Windows上中断](https://github.com/haskell/network/issues/75),所以你必须使用套接字超时作为解决方法。为了便于携带,请同时使用套接字超时*和*'System.Timeout'。 –