git.iko.soy/distributed-process
on master help sign in
Update DemoTCP.
ac26c00Nicolas Wu
examples/DemoTCP.hs+20−12
@@ -7,16 +7,18 @@ import System.Environment
7import Control.Monad
7import Control.Monad
8import qualified Data.ByteString.Char8 as BS
8import qualified Data.ByteString.Char8 as BS
9
9
10+type ChanId = Int
11+
12+-- | This example demonstrates how a master can be connected to slaves using
13+-- the transport layer.
10main :: IO ()
14main :: IO ()
11main = do
15main = do
12− [mode, numberStr, host, service] <- getArgs
16+ [mode, numberStr, host, service, chanId] <- getArgs
13−
14− let number = read numberStr
15−
16− transport <- initTransport (Config undefined)
17−
18 case mode of
17 case mode of
19 "master" -> do
18 "master" -> do
19+ let number = read numberStr
20+ transport <- mkTransport $ TCPConfig defaultHints host service
21+
20 (clients, masterReceiveEnd) <- demoMaster number transport host service
22 (clients, masterReceiveEnd) <- demoMaster number transport host service
21 zipWithM_
23 zipWithM_
22 (\clientSendEnd clientId -> send clientSendEnd [BS.pack . show $ clientId])
24 (\clientSendEnd clientId -> send clientSendEnd [BS.pack . show $ clientId])
@@ -24,6 +26,7 @@ main = do
24 replicateM_ number $ do
26 replicateM_ number $ do
25 [clientMessage] <- receive masterReceiveEnd
27 [clientMessage] <- receive masterReceiveEnd
26 print clientMessage
28 print clientMessage
29+
27 "slave" -> do
30 "slave" -> do
28 (masterSendEnd, slaveReceiveEnd) <- demoSlave transport host service
31 (masterSendEnd, slaveReceiveEnd) <- demoSlave transport host service
29 [clientId] <- receive slaveReceiveEnd
32 [clientId] <- receive slaveReceiveEnd
@@ -34,9 +37,12 @@ demoMaster :: Int -- ^ Number of slaves
34 -> Transport -- ^ Transport
37 -> Transport -- ^ Transport
35 -> HostName -- ^ HostName of the master node
38 -> HostName -- ^ HostName of the master node
36 -> ServiceName -- ^ ServiceName of the master node
39 -> ServiceName -- ^ ServiceName of the master node
37− -> IO ([SendEnd], ReceiveEnd) -- ^
40+ -> IO ([SendEnd], ReceiveEnd)
38demoMaster numSlaves transport host service = do
41demoMaster 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+
40 sendEnds <- replicateM numSlaves $ do
46 sendEnds <- replicateM numSlaves $ do
41 [bytes] <- receive receiveEnd
47 [bytes] <- receive receiveEnd
42 case deserialize transport bytes of
48 case deserialize transport bytes of
@@ -45,10 +51,12 @@ demoMaster numSlaves transport host service = do
45 return (sendEnds, receiveEnd)
51 return (sendEnds, receiveEnd)
46
52
47demoSlave :: Transport -- ^ Transport
53demoSlave :: Transport -- ^ Transport
48− -> HostName -- ^
54+ -> HostName -- ^ The master HostName
49− -> ServiceName -- ^
55+ -> ServiceName -- ^ The master ServiceName
56+ -> ChanId -- ^ The master ChanId
50− -> IO (SendEnd, ReceiveEnd) -- ^
57+ -> IO (SendEnd, ReceiveEnd)
51−demoSlave transport host service = do
58+demoSlave transport host service chanId = do
59+ sendAddr <- mkSendAddr host service chanId
52 (selfSendAddr, selfReceiveEnd) <- newConnection transport
60 (selfSendAddr, selfReceiveEnd) <- newConnection transport
53 sendEnd <- connect (newSendAddr host service)
61 sendEnd <- connect (newSendAddr host service)
54 send sendEnd [serialize selfSendAddr]
62 send sendEnd [serialize selfSendAddr]