@@ -7,16 +7,18 @@ import System.Environment
77import Control.Monad
88import qualified Data.ByteString.Char8 as BS
99
10+type ChanId = Int
11+
12+-- | This example demonstrates how a master can be connected to slaves using
13+-- the transport layer.
1014main :: IO ()
1115main = do
12− [mode, numberStr, host, service] <- getArgs
13−
14− let number = read numberStr
15−
16− transport <- initTransport (Config undefined)
17−
16+ [mode, numberStr, host, service, chanId] <- getArgs
1817 case mode of
1918 "master" -> do
19+ let number = read numberStr
20+ transport <- mkTransport $ TCPConfig defaultHints host service
21+
2022 (clients, masterReceiveEnd) <- demoMaster number transport host service
2123 zipWithM_
2224 (\clientSendEnd clientId -> send clientSendEnd [BS.pack . show $ clientId])
@@ -24,6 +26,7 @@ main = do
2426 replicateM_ number $ do
2527 [clientMessage] <- receive masterReceiveEnd
2628 print clientMessage
29+
2730 "slave" -> do
2831 (masterSendEnd, slaveReceiveEnd) <- demoSlave transport host service
2932 [clientId] <- receive slaveReceiveEnd
@@ -34,9 +37,12 @@ demoMaster :: Int -- ^ Number of slaves
3437 -> Transport -- ^ Transport
3538 -> HostName -- ^ HostName of the master node
3639 -> ServiceName -- ^ ServiceName of the master node
37− -> IO ([SendEnd], ReceiveEnd) -- ^
40+ -> IO ([SendEnd], ReceiveEnd)
3841demoMaster numSlaves transport host service = do
39− receiveEnd <- newReceiveEnd host service
42+ trans <- mkTransport defaultHints host service
43+ (sendAddr, receiveEnd) <- connect trans
44+ putStrLn $ "Master sendAddr:" ++ show . serialize $ sendAddr
45+
4046 sendEnds <- replicateM numSlaves $ do
4147 [bytes] <- receive receiveEnd
4248 case deserialize transport bytes of
@@ -45,10 +51,12 @@ demoMaster numSlaves transport host service = do
4551 return (sendEnds, receiveEnd)
4652
4753demoSlave :: Transport -- ^ Transport
48− -> HostName -- ^
49− -> ServiceName -- ^
50− -> IO (SendEnd, ReceiveEnd) -- ^
51−demoSlave transport host service = do
54+ -> HostName -- ^ The master HostName
55+ -> ServiceName -- ^ The master ServiceName
56+ -> ChanId -- ^ The master ChanId
57+ -> IO (SendEnd, ReceiveEnd)
58+demoSlave transport host service chanId = do
59+ sendAddr <- mkSendAddr host service chanId
5260 (selfSendAddr, selfReceiveEnd) <- newConnection transport
5361 sendEnd <- connect (newSendAddr host service)
5462 send sendEnd [serialize selfSendAddr]