@@ -0,0 +1,56 @@
1+module Main where
2+
3+import Network.Transport
4+import Network.Transport.TCP
5+
6+import System.Environment
7+import Control.Monad
8+import qualified Data.ByteString.Char8 as BS
9+
10+main :: IO ()
11+main = do
12+ [mode, numberStr, host, service] <- getArgs
13+
14+ let number = read numberStr
15+
16+ transport <- initTransport (Config undefined)
17+
18+ case mode of
19+ "master" -> do
20+ (clients, masterReceiveEnd) <- demoMaster number transport host service
21+ zipWithM_
22+ (\clientSendEnd clientId -> send clientSendEnd [BS.pack . show $ clientId])
23+ clients [0 .. number-1]
24+ replicateM_ number $ do
25+ [clientMessage] <- receive masterReceiveEnd
26+ print clientMessage
27+ "slave" -> do
28+ (masterSendEnd, slaveReceiveEnd) <- demoSlave transport host service
29+ [clientId] <- receive slaveReceiveEnd
30+ let message = "Connected to slave: " ++ BS.unpack clientId
31+ send masterSendEnd [BS.pack message]
32+
33+demoMaster :: Int -- ^ Number of slaves
34+ -> Transport -- ^ Transport
35+ -> HostName -- ^ HostName of the master node
36+ -> ServiceName -- ^ ServiceName of the master node
37+ -> IO ([SendEnd], ReceiveEnd) -- ^
38+demoMaster numSlaves transport host service = do
39+ receiveEnd <- newReceiveEnd host service
40+ sendEnds <- replicateM numSlaves $ do
41+ [bytes] <- receive receiveEnd
42+ case deserialize transport bytes of
43+ Nothing -> fail "Garbage message from slave"
44+ Just sendAddr -> connect sendAddr
45+ return (sendEnds, receiveEnd)
46+
47+demoSlave :: Transport -- ^ Transport
48+ -> HostName -- ^
49+ -> ServiceName -- ^
50+ -> IO (SendEnd, ReceiveEnd) -- ^
51+demoSlave transport host service = do
52+ (selfSendAddr, selfReceiveEnd) <- newConnection transport
53+ sendEnd <- connect (newSendAddr host service)
54+ send sendEnd [serialize selfSendAddr]
55+ return (sendEnd, selfReceiveEnd)
56+