Dam*_*les 5 sockets networking haskell
在Network.Socket模块有喜欢的功能isConnected,isBound等等。但没有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应该也有它...) )。