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

Dam*_*les 5 sockets networking haskell

Network.Socket模块有喜欢的功能isConnectedisBound等等。但没有isClosed功能,以检查插座是否关闭。

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

import qualified Network.Socket as Socket

-- ...

close Connection{connSock, serverSock} = do
    Socket.close connSock
    Socket.close serverSock
Run Code Online (Sandbox Code Playgroud)

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

epollControl: does not exist (No such file or directory)
Run Code Online (Sandbox Code Playgroud)

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

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

虽然这样做有效,但缺少isClosed功能使我想知道上面的代码是否存在一些我不知道的潜在问题(例如,它具有竞争条件,但我的猜测是isConnected并且isBound应该也有它...) )。