/// Starts a loop, waiting for connections to send data to. int Start(int argc, char ** argv) { Util::Config conf = Util::Config(argv[0], PACKAGE_VERSION); conf.addOption("stream_name", JSON::fromString("{\"arg_num\":1, \"arg\":\"string\", \"help\":\"Name of the stream this buffer will be providing.\"}")); conf.addOption("awaiting_ip", JSON::fromString("{\"arg_num\":2, \"arg\":\"string\", \"default\":\"\", \"help\":\"IP address to expect incoming data from. This will completely disable reading from standard input if used.\"}")); conf.addOption("reportstats", JSON::fromString("{\"default\":0, \"help\":\"Report stats to a controller process.\", \"short\":\"s\", \"long\":\"reportstats\"}")); conf.parseArgs(argc, argv); std::string name = conf.getString("stream_name"); SS = Util::Stream::makeLive(name); if (!SS.connected()) { perror("Could not create stream socket"); return 1; } conf.activate(); thisStream = Stream::get(); thisStream->setName(name); Socket::Connection incoming; Socket::Connection std_input(fileno(stdin)); tthread::thread * StatsThread = 0; if (conf.getBool("reportstats")){StatsThread = new tthread::thread(handleStats, 0);} tthread::thread * StdinThread = 0; std::string await_ip = conf.getString("awaiting_ip"); if (await_ip == ""){ StdinThread = new tthread::thread(handleStdin, 0); }else{ thisStream->setWaitingIP(await_ip); StdinThread = new tthread::thread(handlePushin, 0); } while (buffer_running && SS.connected() && conf.is_active){ //check for new connections, accept them if there are any //starts a thread for every accepted connection incoming = SS.accept(true); if (incoming.connected()){ user * usr_ptr = new user(incoming); thisStream->addUser(usr_ptr); usr_ptr->Thread = new tthread::thread(handleUser, (void *)usr_ptr); } }//main loop // disconnect listener buffer_running = false; std::cout << "End of input file - buffer shutting down" << std::endl; SS.close(); if (StatsThread){StatsThread->join();} StdinThread->join(); delete thisStream; return 0; }
///\brief Starts a loop, waiting for connections to send data to. ///\param argc The number of arguments to the program. ///\param argv The arguments to the program. ///\return The return code of the buffer. int Start(int argc, char ** argv){ /*std::ofstream myfile ("/home/sharvanath/mistserver/test.txt",std::ios::app); //struct sockaddr add; //socklen_t add_length=sizeof(struct sockaddr); //getsockname(incoming.sock, &add,&add_length); myfile<<"hello1\n"; //myfile << "the family here is : "<<add.sa_family<<"\n"; myfile.close(); */ Util::Config conf = Util::Config(argv[0], PACKAGE_VERSION); conf.addOption("stream_name", JSON::fromString("{\"arg_num\":1, \"arg\":\"string\", \"help\":\"Name of the stream this buffer will be providing.\"}")); conf.addOption("awaiting_ip", JSON::fromString( "{\"arg_num\":2, \"arg\":\"string\", \"default\":\"\", \"help\":\"IP address to expect incoming data from. This will completely disable reading from standard input if used.\"}")); conf.addOption("reportstats", JSON::fromString("{\"default\":0, \"help\":\"Report stats to a controller process.\", \"short\":\"s\", \"long\":\"reportstats\"}")); conf.addOption("time", JSON::fromString( "{\"default\":0, \"arg\": \"integer\", \"help\":\"Buffer a specied amount of time in ms.\", \"short\":\"t\", \"long\":\"time\"}")); conf.parseArgs(argc, argv); std::string name = conf.getString("stream_name"); SS = Util::Stream::makeLive(name); if ( !SS.connected()){ perror("Could not create stream socket"); return 1; } SS.setBlocking(false); conf.activate(); thisStream = Stream::get(); thisStream->setName(name); thisStream->getStream()->setBufferTime(conf.getInteger("time")); Socket::Connection incoming; Socket::Connection std_input(fileno(stdin)); if (conf.getBool("reportstats")){ tthread::thread StatsThread(handleStats, 0); StatsThread.detach(); } std::string await_ip = conf.getString("awaiting_ip"); if (await_ip == ""){ tthread::thread StdinThread(handleStdin, 0); StdinThread.detach(); }else{ thisStream->setWaitingIP(await_ip); tthread::thread StdinThread(handlePushin, 0); StdinThread.detach(); } while (buffer_running && SS.connected() && conf.is_active){ //check for new connections, accept them if there are any //starts a thread for every accepted connection //sharva_mod incoming = SS.accept(true); if (incoming.connected()){ tthread::thread thisUser(handleUser, (void *)new user(incoming)); thisUser.detach(); }else{ Util::sleep(50);//sleep 50ms } } //main loop // disconnect listener buffer_running = false; std::cout << "Buffer shutting down" << std::endl; SS.close(); if (thisStream->getIPInput().connected()){ thisStream->getIPInput().close(); } delete thisStream; return 0; }