1
{-# LANGUAGE ScopedTypeVariables #-}
1
{-# LANGUAGE ScopedTypeVariables, OverloadedStrings #-}
2
2
module NetRoutines where
5
4
import Network.Socket
7
import Control.Concurrent
8
5
import Control.Concurrent.Chan
9
import Control.Concurrent.STM
10
6
import qualified Control.Exception as Exception
12
10
-----------------------------
13
import RoomsAndClients
17
acceptLoop :: Socket -> Chan CoreMessage -> Int -> IO ()
18
acceptLoop servSock coreChan clientCounter = do
20
(\(_ :: Exception.IOException) -> putStrLn "exception on connect") $
15
acceptLoop :: Socket -> Chan CoreMessage -> IO ()
16
acceptLoop servSock chan = forever $
22
(socket, sockAddr) <- Network.Socket.accept servSock
18
(sock, sockAddr) <- Network.Socket.accept servSock
24
cHandle <- socketToHandle socket ReadWriteMode
25
hSetBuffering cHandle LineBuffering
26
20
clientHost <- sockAddr2String sockAddr
28
22
currentTime <- getCurrentTime
52
writeChan coreChan $ Accept newClient
54
forkIO $ clientRecvLoop cHandle coreChan nextID
55
forkIO $ clientSendLoop cHandle coreChan sendChan nextID
48
writeChan chan $ Accept newClient
58
acceptLoop servSock coreChan nextID
60
nextID = clientCounter + 1