git.iko.soy/distributed-process
on master help sign in
Moved DemoIP to DemoTCP.
307d0d1Nicolas Wu
examples/DemoIP.hsdeleted−50
@@ -1,50 +0,0 @@
1−module Main where
2−
3−import Network.Transport
4−import Network.Transport.IP
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, addressStr, portStr] <- getArgs
13−
14− let number = read numberStr
15− let address = Address addressStr
16− let port = read portStr
17−
18− transport <- initTransport (Config undefined)
19−
20− case mode of
21− "master" -> do
22− (clients, masterReceiveEnd) <- demoMaster number transport address port
23− zipWithM_ (\clientSendEnd clientId -> send clientSendEnd [BS.pack . show $ clientId])
24− clients [0 .. number-1]
25− replicateM_ number $ do
26− [clientId] <- receive masterReceiveEnd
27− print clientId
28− "slave" -> do
29− (masterSendEnd, slaveReceiveEnd) <- demoSlave transport address port
30− [clientId] <- receive slaveReceiveEnd
31− let message = "Connected to slave: " ++ BS.unpack clientId
32− send masterSendEnd [BS.pack message]
33−
34−demoMaster :: Int -> Transport -> Address -> Port -> IO ([SendEnd], ReceiveEnd)
35−demoMaster numSlaves transport address port = do
36− receiveEnd <- newReceiveEnd address port
37− sendEnds <- replicateM numSlaves $ do
38− [bytes] <- receive receiveEnd
39− case deserialize transport bytes of
40− Nothing -> fail "Garbage message from slave"
41− Just sendAddr -> connect sendAddr
42− return (sendEnds, receiveEnd)
43−
44−demoSlave :: Transport -> Address -> Port -> IO (SendEnd, ReceiveEnd)
45−demoSlave transport address port = do
46− (selfSendAddr, selfReceiveEnd) <- newConnection transport
47− sendEnd <- connect (newSendAddr address port)
48− send sendEnd [serialize selfSendAddr]
49− return (sendEnd, selfReceiveEnd)
50−
examples/DemoTCP.hsnew file+56
@@ -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+