在Network.Socket
模块中,有isConnected
,isBound
等函数,但没有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
函数让我想知道上面的代码是否有一些我不知道的潜在问题(例如它有竞争条件,但我的猜测是isConnected
和isBound
也应该拥有它......)。