29 auto begin_it = std::get<0>(sent_packets_its);
30 auto end_it = std::get<1>(sent_packets_its);
35 int still_left_cnt = 0;
36 int current_cycle_resent_cnt = 0;
37 for (
auto it = begin_it; it != end_it; ++it) {
41 auto trans_id = pkt->getTransid();
44 auto start_time = pkt->getTimestamp();
45 int current_pkt_resent_cnt = 0;
46 auto r_it = retrans.find(trans_id);
47 auto s_it = start_times.find(trans_id);
48 if (r_it != retrans.end() && s_it != start_times.end()) {
49 start_time = s_it->second;
50 current_pkt_resent_cnt = r_it->second;
52 start_times[trans_id] = start_time;
56 int delay = (1 << current_pkt_resent_cnt);
61 delay += random() % 2000 - 1000;
64 auto now = microsec_clock::universal_time();
65 if (now - start_time > milliseconds(delay)) {
66 current_cycle_resent_cnt++;
71 Pkt4Ptr pkt4 = boost::dynamic_pointer_cast<Pkt4>(pkt);
74 Pkt6Ptr pkt6 = boost::dynamic_pointer_cast<Pkt6>(pkt);
79 pkt->setTimestamp(start_time);
81 current_pkt_resent_cnt++;
82 retrans[trans_id] = current_pkt_resent_cnt;
85 if (current_cycle_resent_cnt > 0) {
86 auto now = microsec_clock::universal_time();
87 std::cout << now <<
" " << xchg_type <<
": still waiting for "
88 << still_left_cnt <<
" answers, resent " << current_cycle_resent_cnt
89 <<
", retrying " << retrans.size() << std::endl;
91 return still_left_cnt;
109 uint32_t clients_num =
options_.getClientsNum() == 0 ?
116 auto start = microsec_clock::universal_time();
119 tc_.sendPackets(clients_num);
121 auto now = microsec_clock::universal_time();
122 auto prev_cycle_time = now;
126 tc_.consumeReceivedPackets();
130 now = microsec_clock::universal_time();
135 if (now - prev_cycle_time > milliseconds(200)) {
136 prev_cycle_time = now;
137 int still_left_cnt = 0;
143 if (still_left_cnt == 0) {
148 if (
tc_.interrupted()) {
153 auto stop = microsec_clock::universal_time();
154 boost::posix_time::time_period duration(start, stop);
166 if (
options_.testDiags(
's') &&
tc_.serverIdReceived()) {
167 std::cout <<
"Server id: " <<
tc_.getServerId() << std::endl;
172 std::cout <<
"Interrupted" << std::endl;
182 int total_rcvd_pkts = 0;
193 std::cout <<
"It took " << duration.length() <<
" to provision " << clients_num
194 <<
" clients. " << std::endl
195 <<
"Requests sent + resent: " << total_sent_pkts << std::endl
197 <<
"Responses received: " << total_rcvd_pkts << std::endl;
std::unordered_map< ExchangeType, std::unordered_map< uint32_t, boost::posix_time::ptime >, EnumClassHash > start_times_
A map xchg type -> (a map of trans id -> time of sending first packet.