@@ -0,0 +1,56 @@
3+import Network.Transport
4+import Network.Transport.TCP
6+import System.Environment
8+import qualified Data.ByteString.Char8 as BS
12+ [mode, numberStr, host, service] <- getArgs
14+ let number = read numberStr
16+ transport <- initTransport (Config undefined)
20+ (clients, masterReceiveEnd) <- demoMaster number transport host service
22+ (\clientSendEnd clientId -> send clientSendEnd [BS.pack . show $ clientId])
23+ clients [0 .. number-1]
24+ replicateM_ number $ do
25+ [clientMessage] <- receive masterReceiveEnd
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]
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)
47+demoSlave :: Transport -- ^ Transport
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)