Ich versuche, das Empfangs-Timeout auf einem Sockel mit dem Network.Socket
Modul zu setzen. Hier ist ein Code-Schnipsel:Einstellen der Socket-Optionen auf 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
Die setSocketOption
Linie löst eine Ausnahme:
*** Exception: setSocketOption: invalid argument (Invalid argument)
setSocketOption
nur Int
Argumente für Einstellungen akzeptiert, aber nicht alle der Socket-Optionen wollen ein Int
. Speziell RecvTimeOut
und SendTimeOut
erwarten Sie eine struct timeval
. Gibt es eine andere Möglichkeit, diese Optionen aus Haskell zu setzen?
Ich bin mit GHC 7.4.2 auf OSX 10.8.1
EDIT:
Network.Socket.Options
scheint die beste Lösung hier, und es immer auf OSX zu kompilieren nur ein stellte sich heraus zu verlangen winzige Pull-Anfrage. Ab Version 0.2.0.1 kompiliert network-socket-options jetzt auf OSX.
EDIT 2: Kein Glück mit Network.Socket.Options
. Die setRecvTimeout
Funktion scheint keine Auswirkungen auf OSX zu haben. Ich habe am Ende timeout
aus dem System.Timeout
-Paket als Workaround verwendet.
msg <- timeout 120000000 $ recv sock 1024
funktioniert diese Hilfe: http: // www. haskell.org/pipermail/haskell/2005-Oktober/016586.html? Oder das: http://hackage.haskell.org/packages/archive/network-socket-options/0.2/doc/html/Network-Socket-Options.html? – paulsm4
Unter Mac OS X und Linux verwendet GHC nicht blockierende Socket-E/A, die nicht von Socket-Timeouts betroffen sind. Die Verwendung von 'System.Timeout 'ist die richtige Methode zum Timeout von E/A-Vorgängen. Leider kann [Netzwerk-E/A derzeit unter Windows nicht unterbrochen werden] (https://github.com/haskell/network/issues/75). Daher müssen Sie Socket-Timeouts als Workaround verwenden. Für die Portabilität verwenden Sie sowohl Socket-Timeouts * als auch * System.Timeout. –