int main() { std::string line; Events events; while (std::getline(std::cin, line)) { std::vector<std::string> elements; boost::split(elements, line, boost::is_any_of("/")); if (elements.size() != 4) { std::cerr << "Warning: elements.size() != 4" << std::endl; continue; } Event e; e.player = elements[0]; e.map = elements[1]; e.lapTime = parseLapTime(elements[2]); e.date = parseDate(elements[3]); events.push_back(e); } std::cout << "Number of events: " << events.size() << std::endl; std::sort(events.begin(), events.end()); std::cout << "Last event: " << events.back() << std::endl; Ranking ranking = getRankings(events, boost::posix_time::time_from_string("2014-01-03 22:00:00.000")); for ( unsigned i = 0; i < 20 && i < ranking.size(); ++i ) { std::cout << i+1 << ".: " << ranking[i].getPlayer() << ", Time: " << ranking[i].getTotalLapTime() << std::endl; } std::cout << "Current leader = " << ranking[0].getTotalLapTime() << std::endl; }
int count () const { return int(m_events.size()); }
int main(int argc, char *argv[]) { int c; bool use_cors = false; std::string remote_str, filename; sockaddr_in local, remote; timeval tm_start, tm_end; uint32_t delay = DEFAULT_DELAY; uint8_t relaynum = DEFAULT_RLNUM; // default arguments memset(&local, 0, sizeof(local)); local.sin_family = AF_INET; local.sin_port = htons(DEFAULT_PORT); local.sin_addr.s_addr = htonl(INADDR_ANY); replay = 1; while((c = getopt(argc, argv, "cd:l:n:p:r:")) != -1) { switch(c) { case 'c': use_cors = true; break; case 'd': delay = atoi(optarg); break; case 'l': local.sin_port = htons(atoi(optarg)); break; case 'n': replay = atoi(optarg); break; case 'p': relaynum = atoi(optarg); break; case 'r': remote_str = optarg; break; case '?': PrintUsage(); break; } } if (optind != argc - 1) { cout << "must specify an input file" << endl; PrintUsage(); return -1; } filename = argv[optind]; if (remote_str.empty()) { cout << "must specify remote addr -- ip:port" << endl; PrintUsage(); return -1; } size_t pos = remote_str.find(":"); memset(&remote, 0, sizeof(remote)); remote.sin_family = AF_INET; remote.sin_port = htons(atoi(remote_str.substr(pos+1).c_str())); remote.sin_addr.s_addr = inet_addr(remote_str.substr(0, pos).c_str()); cout << "use_cors: " << (use_cors ? "yes" : "no") << endl; cout << "local addr: " << sockaddr2str(local) << endl; cout << "remote addr: " << sockaddr2str(remote) << endl; cout << "replay time: " << replay << endl; cout << "delay requirement: " << delay << "ms" << endl; cout << "relay path number: " << (int)relaynum << endl; cout << "input file: " << filename << endl; Events events; if (ReadRtpData(filename, &events) < 0) { return -1; } int sock; if ((sock = InitSock(local)) < 0) { return -1; } int flags; if ((flags = fcntl(sock, F_GETFL, 0)) < 0) { cerr << "fcntl(GETFL) error" << endl; return -1; } if (fcntl(sock, F_SETFL, flags | O_NONBLOCK) < 0) { cerr << "fcntl(SETFL) error" << endl; return -1; } Requirement req; memset(&req, 0, sizeof(req)); req.delay = delay; req.relaynum = relaynum; Feature feature; memset(&feature, 0, sizeof(feature)); feature.delay = delay; feature.significance = 0; feature.seculevel = 0; feature.channelnum = relaynum; vector<string> rsparams, mmparams; rsparams.push_back("SimpleRlysltr"); rsparams.push_back("rsltr.conf"); rsparams.push_back("300000"); // probe interval rsparams.push_back("300"); // timeout seconds mmparams.push_back("SimpleMpathManager"); CorsSocket *cors_sk = NULL; if (use_cors) { cors_sk = new CorsSocket(sock, rsparams, mmparams); cors_sk->init(req, remote.sin_addr.s_addr, remote.sin_port); } pthread_t recv_tid, timer_tid; if (use_cors) { pthread_create(&recv_tid, NULL, recv_thread, cors_sk); } // pthread_create(&timer_tid, NULL, timer_thread, &events); int index = 0; int sended = 0; int target = 0; timeval tm_used, tm_begin; // gettimeofday(&tm_begin, NULL); Events::iterator it; for (; replay > 0; replay--) { for (it = events.begin(); it != events.end(); ++it) { timeval timeout = it->delta; select(0, NULL, NULL, NULL, &timeout); if (use_cors) { cors_sk->sendto(it->pkt, it->len, remote.sin_addr.s_addr, remote.sin_port, feature); } else { sendto(sock, it->pkt, it->len, 0, (sockaddr *)&remote, sizeof(remote)); } sended++; } } #if 0 while (true) { pthread_mutex_lock(&timer_mutex); while (timer_sig == -1) { pthread_cond_wait(&timer_cond, &timer_mutex); } index = timer_sig; timer_sig = -1; pthread_mutex_unlock(&timer_mutex); if (index == -2) { target = events.size(); } else { target = index + 1; } for (int i = sended; i < target; i++) { //gettimeofday(&tm_start, NULL); // tm_used = CalcDelta(tm_start, tm_begin); //cout << "#### main() send " << i << " at " << tm_start.tv_sec // << "." << setw(6) << setfill('0') << tm_start.tv_usec << endl; if (use_cors) { // gettimeofday(&tm_start, NULL); // tm_used = CalcDelta(tm_start, tm_begin); // cout << "#### main() send " << i << " at " << tm_start.tv_sec // << "." << setw(6) << setfill('0') << tm_start.tv_usec << endl; // Arguments *arg = new Arguments; // arg->cors = &cors_sk; // arg->buf = events[i].pkt; // arg->len = events[i].len; // arg->addr = &remote; // arg->feature = &feature; // pthread_t send_tid; // pthread_create(&send_tid, NULL, send_thread, arg); cors_sk.sendto(events[i].pkt, events[i].len, remote.sin_addr.s_addr, remote.sin_port, feature); // gettimeofday(&tm_end, NULL); // cout << "#### main() finish send at " << tm_end.tv_sec // << "." << setw(6) << setfill('0') << tm_end.tv_usec << endl; // tm_used = CalcDelta(tm_end, tm_start); // cout << "#### main() time_used = " << tm_used.tv_sec // << "." << setw(6) << setfill('0') << tm_used.tv_usec << endl; } else { // gettimeofday(&tm_start, NULL); // tm_used = CalcDelta(tm_start, tm_begin); // cout << "#### main() send " << i << " at " << tm_start.tv_sec // << "." << setw(6) << setfill('0') << tm_start.tv_usec << endl; sendto(sock, events[i].pkt, events[i].len, 0, (sockaddr *)&remote, sizeof(remote)); // gettimeofday(&tm_end, NULL); // cout << "#### main() finish send at " << tm_end.tv_sec // << "." << setw(6) << setfill('0') << tm_end.tv_usec << endl; // tm_used = CalcDelta(tm_end, tm_start); // cout << "#### main() time_used = " << tm_used.tv_sec // << "." << setw(6) << setfill('0') << tm_used.tv_usec << endl; } sended++; } if (index == -2) break; // if (index == -2) { // for (int i = sended; i < events.size) // break; // } else { // for (int i = sended; i <= index; i++) { // if (use_cors) // cors_sk.sendto(events[i].pkt, // events[i].len, // remote.sin_addr.s_addr, // remote.sin_port, // feature); // else // sendto(sock, events[i].pkt, // events[i].len, 0, // (sockaddr *)&remote, sizeof(remote)); // sended++; // } // } // cout << "time_used main = " // << tm_end.tv_usec - tm_start.tv_usec << endl; } #endif cout << "total send: " << sended << " packets" << endl; if (use_cors) cors_sk->close(); close(sock); return 0; }