为什么Network.Socket上没有isClosed函数

时间:2018-01-03 10:51:34

标签: sockets haskell networking

Network.Socket模块中,有isConnectedisBound等函数,但没有isClosed函数,用于检查套接字是否已关闭。

我正在编写一个需要关闭套接字连接的模块:

import qualified Network.Socket as Socket

-- ...

close Connection{connSock, serverSock} = do
    Socket.close connSock
    Socket.close serverSock

问题是,如果套接字已经关闭(例如在客户端),我将收到以下错误:

epollControl: does not exist (No such file or directory)

所以我现在在关闭它之前检查套接字是否已打开:

  closeIfOpen sock = do
      let MkSocket _ _ _ _ stMV = sock
      st <- readMVar stMV
      case st of
          Closed -> return ()
          _ -> Socket.close sock

虽然这有效但缺少isClosed函数让我想知道上面的代码是否有一些我不知道的潜在问题(例如它有竞争条件,但我的猜测是isConnectedisBound也应该拥有它......)。

0 个答案:

没有答案