我試圖在使用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'。 –