@@ -53,7 +53,8 @@ decode :: Ser.Serialize a => BS.ByteString -> Either String a
53main :: IO ()
53main :: IO ()
55 [pingsStr] <- getArgs
55 [pingsStr] <- getArgs
56+ serverAddr <- newEmptyMVar
56− serverReady <- newEmptyMVar
57+ clientAddr <- newEmptyMVar
58 -- Start the server
59 -- Start the server
59 forkIO $ do
60 forkIO $ do
@@ -63,19 +64,19 @@ main = do
63 -- create ping end
64 -- create ping end
64 putStrLn "server: creating ping end"
65 putStrLn "server: creating ping end"
65 (sourceAddrPing, targetEndPing) <- newConnection transport
66 (sourceAddrPing, targetEndPing) <- newConnection transport
66− putMVar serverReady sourceAddrPing
67+ putMVar serverAddr sourceAddrPing
68 -- create pong end
69 -- create pong end
69 putStrLn "server: creating pong end"
70 putStrLn "server: creating pong end"
70− [sourceAddrPongBS] <- receive targetEndPing
71+ sourceAddrPong <- takeMVar clientAddr
71− sourceEndPong <- connect . fromJust $ deserialize transport sourceAddrPongBS
72+ sourceEndPong <- connect sourceAddrPong
73 -- always respond to a ping with a pong
74 -- always respond to a ping with a pong
74 putStrLn "server: awaiting pings"
75 putStrLn "server: awaiting pings"
75 pong targetEndPing sourceEndPong
76 pong targetEndPing sourceEndPong
78− sourceAddr <- takeMVar serverReady
79+ sourceAddr <- takeMVar serverAddr
79 let pings = read pingsStr
80 let pings = read pingsStr
80 -- establish transport
81 -- establish transport
81 transport <- mkTransport $ TCPConfig defaultHints "127.0.0.1" "8081"
82 transport <- mkTransport $ TCPConfig defaultHints "127.0.0.1" "8081"
@@ -85,7 +86,7 @@ main = do
86 -- create pong end
87 -- create pong end
87 (sourceAddrPong, targetEndPong) <- newConnection transport
88 (sourceAddrPong, targetEndPong) <- newConnection transport
88− send sourceEndPing [serialize sourceAddrPong]
89+ putMVar clientAddr sourceAddrPong
90 ping sourceEndPing targetEndPong pings
91 ping sourceEndPing targetEndPong pings
91 putStrLn "Done with all ping/pongs."
92 putStrLn "Done with all ping/pongs."
@@ -97,8 +98,9 @@ pingMessage = BS.pack "ping123"
97-- | Keep replying to pings (send pongs)
98-- | Keep replying to pings (send pongs)
98pong :: TargetEnd -> SourceEnd -> IO ()
99pong :: TargetEnd -> SourceEnd -> IO ()
99pong targetEndPing sourceEndPong = do
100pong targetEndPing sourceEndPong = do
100− bs <- receive targetEndPing
101+ [bs] <- receive targetEndPing
102+ -- putStrLn $ "server got " ++ BS.unpack bs
101− send sourceEndPong bs
103+ send sourceEndPong [bs]
102 pong targetEndPing sourceEndPong
104 pong targetEndPing sourceEndPong
104-- | Send a number of pings
106-- | Send a number of pings
@@ -113,6 +115,7 @@ ping sourceEndPing targetEndPong pings = go [] pings
113 before <- getCurrentTime
115 before <- getCurrentTime
114 send sourceEndPing [pingMessage]
116 send sourceEndPing [pingMessage]
115 [bs] <- receive targetEndPong
117 [bs] <- receive targetEndPong
118+ -- putStrLn $ "client got " ++ BS.unpack bs
116 after <- getCurrentTime
119 after <- getCurrentTime
117 let latency = (1e6 :: Double) * realToFrac (diffUTCTime after before)
120 let latency = (1e6 :: Double) * realToFrac (diffUTCTime after before)
118 latency `seq` go (latency : rtl) (i - 1)
121 latency `seq` go (latency : rtl) (i - 1)