Estoy tratando de establecer el tiempo de espera de recepción en un socket construido con el módulo Network.Socket
. He aquí un fragmento de código:Configuración de opciones de socket en 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
La línea setSocketOption
lanza una excepción:
*** Exception: setSocketOption: invalid argument (Invalid argument)
setSocketOption
sólo acepta Int
argumentos a favor de la configuración, pero no todas las opciones de conector quieren un Int
. Específicamente RecvTimeOut
y SendTimeOut
esperan un struct timeval
. ¿Hay alguna otra forma de establecer estas opciones desde haskell?
estoy corriendo GHC 7.4.2 en OSX 10.8.1
EDIT:
Network.Socket.Options
parece ser la mejor solución a este problema, y conseguir que para compilar en OSX resultó requerir sólo una pequeña solicitud de extracción. A partir de la versión 0.2.0.1, network-socket-options ahora compila en OSX.
EDITAR 2: No hubo suerte con Network.Socket.Options
. La función setRecvTimeout
no parece tener ningún efecto en OSX. Terminé usando timeout
del paquete System.Timeout
como una solución.
msg <- timeout 120000000 $ recv sock 1024
ayuda esto a: http: // www. haskell.org/pipermail/haskell/2005-October/016586.html? O esto: http://hackage.haskell.org/packages/archive/network-socket-options/0.2/doc/html/Network-Socket-Options.html? – paulsm4
En Mac OS X y Linux, GHC utiliza E/S de socket sin bloqueo, que no se ve afectado por los tiempos de espera del socket. El uso de 'System.Timeout' es la forma correcta de finalizar las operaciones de E/S. Lamentablemente, [la E/S de red no se puede interrumpir actualmente en Windows] (https://github.com/haskell/network/issues/75), por lo que tendrá que usar el tiempo de espera del socket como solución temporal. Para la portabilidad, use los tiempos de espera del socket * y * 'System.Timeout'. –