Sockets 检测TCP连接何时无法打开或终止
我通过双工句柄h读写TCP套接字 在客户端:Sockets 检测TCP连接何时无法打开或终止,sockets,haskell,tcp,Sockets,Haskell,Tcp,我通过双工句柄h读写TCP套接字 在客户端: sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr) connect sock $ addrAddress addr h <- getSocketHandle conn sock多亏了的建议,我发现问题与handle/socket无关,并且异常确实正确抛出 正在运行的最小客户端/服务器设置: 它基于Network.Socket包中的示例,但处
sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
connect sock $ addrAddress addr
h <- getSocketHandle conn
sock多亏了的建议,我发现问题与handle/socket无关,并且异常确实正确抛出
正在运行的最小客户端/服务器设置:
它基于Network.Socket包中的示例,但处理多个解析地址,并使用句柄读取/写入套接字
真正的问题是由于在某些情况下错误地处理异常,而不是像这样:
race (send h) (receive h) `finally` disconnected
是的
你有没有一个简单的例子来说明这个问题?我无法复制您的代码中的任何一个问题——对我来说,当一端挂断时,另一端的hGetLine
会出现EOF异常;当没有可用的服务器时,客户端的connect
调用会出现连接被拒绝
异常。再次感谢您-这是我的错误。尝试用一个更简单的案例进行复制,它确实如您所描述的那样工作-问题是由于在某些情况下没有正确处理异常-请参阅答案。
getSocketHandle :: Socket -> IO Handle
getSocketHandle conn = do
h <- socketToHandle conn ReadWriteMode
hSetBinaryMode h True
hSetNewlineMode h NewlineMode {inputNL = CRLF, outputNL = CRLF}
hSetBuffering h LineBuffering
return h
race (send h) (receive h) `finally` disconnected
race (send h) (receive h) >> disconnected