void start_test(sp_int32 nclients, sp_uint64 requests) { // start the server thread std::thread sthread(start_server, SERVER_PORT); auto start = std::chrono::high_resolution_clock::now(); // start the client threads std::vector<std::thread> cthreads; for (sp_int32 i = 0; i < nclients; i++) { cthreads.push_back(std::thread(start_client, SERVER_PORT, requests)); } // wait for the client threads to terminate for (auto& thread : cthreads) { thread.join(); } auto stop = std::chrono::high_resolution_clock::now(); // now send a terminate message to server terminate_server(SERVER_PORT); sthread.join(); ASSERT_TRUE(server_->sent_pkts() == server_->recv_pkts()); ASSERT_TRUE(server_->sent_pkts() == nclients * requests); std::cout << nclients << " client(s) exchanged a total of " << requests << " in " << std::chrono::duration_cast<std::chrono::milliseconds>(stop - start).count() << " ms." << std::endl; delete server_; }
// main int main(int argc, char** argv) { BApplication app("application/x-vnd.antares-netfs_server_prefs"); // parse first argument int argi = 1; const char* arg = next_arg(argc, argv, argi); if (strcmp(arg, "-h") == 0 || strcmp(arg, "--help") == 0) print_usage_and_exit(false); if (strcmp(arg, "launch") == 0) { // launch no_more_args(argc, argi); launch_server(); } else if (strcmp(arg, "terminate") == 0) { // terminate no_more_args(argc, argi); terminate_server(); } else if (strcmp(arg, "save") == 0) { // save no_more_args(argc, argi); save_server_setttings(); } else if (strcmp(arg, "l") == 0 || strcmp(arg, "list") == 0) { // list no_more_args(argc, argi); list(); } else if (strcmp(arg, "add") == 0) { // add arg = next_arg(argc, argv, argi); if (strcmp(arg, "share") == 0) { // share const char* name = next_arg(argc, argv, argi); const char* path = next_arg(argc, argv, argi); no_more_args(argc, argi); add_share(name, path); } else if (strcmp(arg, "user") == 0) { // user const char* name = next_arg(argc, argv, argi); const char* password = next_arg(argc, argv, argi, true); no_more_args(argc, argi); add_user(name, password); } else print_usage_and_exit(true); } else if (strcmp(arg, "remove") == 0) { // remove arg = next_arg(argc, argv, argi); if (strcmp(arg, "share") == 0) { // share const char* name = next_arg(argc, argv, argi); no_more_args(argc, argi); remove_share(name); } else if (strcmp(arg, "user") == 0) { // user const char* name = next_arg(argc, argv, argi); no_more_args(argc, argi); remove_user(name); } else print_usage_and_exit(true); } else if (strcmp(arg, "permissions") == 0) { // permissions const char* user = next_arg(argc, argv, argi); const char* share = next_arg(argc, argv, argi); uint32 permissions = 0; while (argi < argc) { uint32 perms = 0; arg = next_arg(argc, argv, argi); if (!get_permissions(arg, &perms)) print_usage_and_exit(true); permissions |= perms; } set_user_permissions(user, share, permissions); } else { print_usage_and_exit(true); } return 0; }