gameServer/ClientIO.hs
changeset 8371 0551b5c3de9a
parent 7388 92535bc7e928
child 8454 46b59c529bb1
equal deleted inserted replaced
8370:0c79946e96f8 8371:0551b5c3de9a
    28         if B.null packet then  return [] else
    28         if B.null packet then  return [] else
    29          do packets <- takePacks
    29          do packets <- takePacks
    30             return (B.splitWith (== '\n') packet : packets)
    30             return (B.splitWith (== '\n') packet : packets)
    31 
    31 
    32 listenLoop :: Socket -> Chan CoreMessage -> ClientIndex -> IO ()
    32 listenLoop :: Socket -> Chan CoreMessage -> ClientIndex -> IO ()
    33 listenLoop sock chan ci = recieveWithBufferLoop B.empty
    33 listenLoop sock chan ci = receiveWithBufferLoop B.empty
    34     where
    34     where
    35         recieveWithBufferLoop recvBuf = do
    35         receiveWithBufferLoop recvBuf = do
    36             recvBS <- recv sock 4096
    36             recvBS <- recv sock 4096
    37             unless (B.null recvBS) $ do
    37             unless (B.null recvBS) $ do
    38                 let (packets, newrecvBuf) = bs2Packets $ B.append recvBuf recvBS
    38                 let (packets, newrecvBuf) = bs2Packets $ B.append recvBuf recvBS
    39                 forM_ packets sendPacket
    39                 forM_ packets sendPacket
    40                 recieveWithBufferLoop newrecvBuf
    40                 receiveWithBufferLoop newrecvBuf
    41 
    41 
    42         sendPacket packet = writeChan chan $ ClientMessage (ci, packet)
    42         sendPacket packet = writeChan chan $ ClientMessage (ci, packet)
    43 
    43 
    44 clientRecvLoop :: Socket -> Chan CoreMessage -> Chan [B.ByteString] -> ClientIndex -> (forall a. IO a -> IO a) -> IO ()
    44 clientRecvLoop :: Socket -> Chan CoreMessage -> Chan [B.ByteString] -> ClientIndex -> (forall a. IO a -> IO a) -> IO ()
    45 clientRecvLoop s chan clChan ci restore =
    45 clientRecvLoop s chan clChan ci restore =
    46     (myThreadId >>=
    46     (myThreadId >>=
    47     \t -> (restore $ forkIO (clientSendLoop s t clChan ci) >>
    47       (\t -> (restore $ forkIO (clientSendLoop s t clChan ci) >>
    48         listenLoop s chan ci >> return "Connection closed")
    48         listenLoop s chan ci >> return "Connection closed")
    49         `Exception.catch` (\(e :: ShutdownThreadException) -> return . B.pack . show $ e)
    49         `Exception.catch` (\(e :: ShutdownThreadException) -> return . B.pack . show $ e)
    50         `Exception.catch` (\(e :: Exception.IOException) -> return . B.pack . show $ e)
    50         `Exception.catch` (\(e :: Exception.IOException) -> return . B.pack . show $ e)
    51         `Exception.catch` (\(e :: Exception.SomeException) -> return . B.pack . show $ e)
    51         `Exception.catch` (\(e :: Exception.SomeException) -> return . B.pack . show $ e)
       
    52       )
    52         >>= clientOff) `Exception.finally` remove
    53         >>= clientOff) `Exception.finally` remove
    53     where
    54     where
    54         clientOff msg = writeChan chan $ ClientMessage (ci, ["QUIT", msg])
    55         clientOff msg = writeChan chan $ ClientMessage (ci, ["QUIT", msg])
    55         remove = do
    56         remove = do
    56             clientOff "Client is in some weird state"
    57             clientOff "Client is in some weird state"