Sockets 检测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包中的示例,但处

我通过双工句柄h读写TCP套接字

在客户端:

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