void Ut_MAppletServer::testReconnect() { setupServer(); QCOMPARE(socket->state(), QLocalSocket::ConnectedState); QCOMPARE(m_subject->isConnected(), true); m_subject->closeConnection(); QCOMPARE(m_subject->isConnected(), false); // Test that new connections can't be made delete socket; socket = new QLocalSocket; socket->connectToServer(QDir::homePath() + "/moopwidget_1"); QCOMPARE(socket->waitForConnected(), false); QCOMPARE(socket->error(), QLocalSocket::ServerNotFoundError); QCOMPARE(m_subject->isConnected(), false); // Test that restarting the server works delete socket; connected = false; setupServer(); QCOMPARE(connected, true); QCOMPARE(socket->state(), QLocalSocket::ConnectedState); QCOMPARE(m_subject->isConnected(), true); }
void Ut_MAppletServer::testConnection() { setupServer(); // Verify whether connection has been established or not QCOMPARE(connected, true); }
int main(int argc, char *argv[]) { int port; int c; char *strPort; if (argc != 3) { usage(argv[0]); } while ( (c = getopt(argc, argv, "p:")) != -1) { switch (c) { case 'p': strPort = optarg; break; case '?': default: usage(argv[0]); } } signal(SIGINT, sigintHandler); port = atoi(strPort); setupServer(port); runServer(); }
RKGraphicsDeviceFrontendTransmitter::RKGraphicsDeviceFrontendTransmitter () : QObject () { RK_TRACE (GRAPHICS_DEVICE); connection = 0; local_server = 0; setupServer (); }
//-------------------------------------------------------------- void ccs::setup(){ svrGui = ofxGui::Instance(this); //ofxNxmlFile storedFile("config.nxml"); setupServer(); drawGUI(); serverIsRunning = false; runServerRequest = srvAutoStart; }
ClientDefinitions::ClientDefinitions( char * initKey ) : server( LOCAL_SERVER_PORT ) // initialization list { char * oneTimeKey; memset( oneTimeKey, NULL, KEY_LENGTH + 1 ); //char postData[ POST_DATA_LENGTH ]; unsigned char authTryCount = 0; Serial.begin( 9600 ); Serial.print( "Free ram: " ); Serial.println( freeRam( ) ); initEthernet( ); server.begin( ); setupServer( ); setupClient( false, &authTryCount, initKey ); //Serial.println( "Success." ); }
MainWindow::MainWindow() { // User interface ---------------------------------------------------------- if (tr("LTR") == "RTL") { qApp->setLayoutDirection(Qt::RightToLeft); } setupUi(this); network_access_manager = new QNetworkAccessManager(this); default_printer = NULL; #ifdef Q_OS_MAC this->setUnifiedTitleAndToolBarOnMac(true); #endif progressBar = new QProgressBar(this); progressBar->setTextVisible(false); progressBar->resize(QSize(30, 10)); statusBar()->addPermanentWidget(progressBar, 0); statusBar()->setFixedHeight(20); progressBar->setFixedWidth(150); progressBar->setFixedHeight(15); progressBar->setVisible(false); LQCategoryComboBox->setVisible(false); SQStatisticsLabel->setVisible(false); currentSvgChanged(); btnApply = SQButtonBox->button(QDialogButtonBox::Apply); btnApply->setText(tr("Apply")); btnApply->setStatusTip(tr("Apply any changes you have made to the question")); btnApply->setIcon(QIcon(QString::fromUtf8(":/images/images/button_ok.png"))); btnDiscard = SQButtonBox->button(QDialogButtonBox::Discard); btnDiscard->setText(tr("Discard")); btnDiscard->setStatusTip(tr("Discard any changes you have made to the question")); btnDiscard->setIcon(QIcon(QString::fromUtf8(":/images/images/button_cancel.png"))); SQQuestionTextEdit->setTitle(tr("Question:")); SQQuestionTextEdit->textEdit()->setStatusTip(tr("Text of the selected question")); ECTextEdit->setTitle(tr("Comments:")); ECTextEdit->textEdit()->setStatusTip(tr("Use this field for your comments, notes, reminders...")); EFTreeWidget->setMouseTracking(true); EFTreeWidget->header()->setSectionResizeMode(0, QHeaderView::Fixed); EFTreeWidget->header()->setSectionResizeMode(1, QHeaderView::Stretch); EFTreeWidget->header()->setSectionResizeMode(2, QHeaderView::ResizeToContents); EFButtonBox->button(QDialogButtonBox::Apply)->setText(tr("Apply")); EFButtonBox->button(QDialogButtonBox::Apply)->setStatusTip(tr("Apply any changes you have made to the categories")); EFButtonBox->button(QDialogButtonBox::Apply)->setIcon(QIcon(QString::fromUtf8(":/images/images/button_ok.png"))); EFButtonBox->button(QDialogButtonBox::Discard)->setText(tr("Discard")); EFButtonBox->button(QDialogButtonBox::Discard)->setStatusTip(tr("Discard any changes you have made to the categories")); EFButtonBox->button(QDialogButtonBox::Discard)->setIcon(QIcon(QString::fromUtf8(":/images/images/button_cancel.png"))); // Initialize variables ---------------------------------------------------- // URLs docs_url = tr("http://itest.sourceforge.net/documentation/%1/en/").arg("1.4"); // i18n QTranslator translator; translator.load(":/i18n/iTest-i18n.qm"); itest_i18n.insert("English", "en"); itest_i18n.insert(translator.translate("LanguageNames", "Slovak"), "sk"); itest_i18n.insert(translator.translate("LanguageNames", "Russian"), "ru"); itest_i18n.insert(translator.translate("LanguageNames", "Turkish"), "tr"); itest_i18n.insert(translator.translate("LanguageNames", "Portuguese"), "pt"); itest_i18n.insert(translator.translate("LanguageNames", "Spanish"), "es"); itest_i18n.insert(translator.translate("LanguageNames", "Italian"), "it"); itest_i18n.insert(translator.translate("LanguageNames", "Latvian"), "lv"); itest_i18n.insert(translator.translate("LanguageNames", "Ukrainian"), "uk"); itest_i18n.insert(translator.translate("LanguageNames", "Czech"), "cs"); itest_i18n.insert(translator.translate("LanguageNames", "Hungarian"), "hu"); itest_i18n.insert(translator.translate("LanguageNames", "German"), "de"); // CURRENT_DB current_db_open = false; current_db_session = NULL; current_db_class = NULL; current_db_categories.resize(20); current_db_categories_enabled.resize(20); // Connect slots ----------------------------------------------------------- tbtnAddQuestion->setDefaultAction(actionAdd); tbtnDuplicateQuestion->setDefaultAction(actionDuplicate); tbtnDeleteQuestion->setDefaultAction(actionDelete); QObject::connect(actionAdd, SIGNAL(triggered()), this, SLOT(addQuestion())); QObject::connect(actionDelete, SIGNAL(triggered()), this, SLOT(deleteQuestion())); QObject::connect(actionDuplicate, SIGNAL(triggered()), this, SLOT(duplicateQuestion())); QObject::connect(btnApply, SIGNAL(released()), this, SLOT(applyQuestionChanges())); QObject::connect(actionApply, SIGNAL(triggered()), this, SLOT(applyQuestionChanges())); QObject::connect(btnDiscard, SIGNAL(released()), this, SLOT(discardQuestionChanges())); QObject::connect(actionDiscard, SIGNAL(triggered()), this, SLOT(discardQuestionChanges())); QObject::connect(actionNew, SIGNAL(triggered()), this, SLOT(newDB())); QObject::connect(btnNew, SIGNAL(released()), this, SLOT(newDB())); QObject::connect(actionOpen, SIGNAL(triggered()), this, SLOT(open())); QObject::connect(btnOpenOther, SIGNAL(released()), this, SLOT(open())); QObject::connect(btnOpenSelected, SIGNAL(released()), this, SLOT(openRecent())); QObject::connect(actionSave, SIGNAL(triggered()), this, SLOT(save())); QObject::connect(actionSave_as, SIGNAL(triggered()), this, SLOT(saveAs())); QObject::connect(actionSave_a_copy, SIGNAL(triggered()), this, SLOT(saveCopy())); QObject::connect(actionExport_CSV, SIGNAL(triggered()), this, SLOT(exportCSV())); QObject::connect(actionClose, SIGNAL(triggered()), this, SLOT(closeDB())); QObject::connect(actionQuit, SIGNAL(triggered()), this, SLOT(quit())); QObject::connect(actionAbout, SIGNAL(triggered()), this, SLOT(about())); QObject::connect(recentDBsListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(openRecent(QListWidgetItem *))); QObject::connect(LQListWidget, SIGNAL(currentTextChanged(QString)), this, SLOT(setCurrentQuestion())); QObject::connect(actionFrom_A_to_Z, SIGNAL(triggered()), this, SLOT(sortQuestionsAscending())); QObject::connect(actionFrom_Z_to_A, SIGNAL(triggered()), this, SLOT(sortQuestionsDescending())); QObject::connect(actionBy_category, SIGNAL(triggered()), this, SLOT(sortQuestionsByCategory())); tbtnAddSVG->setDefaultAction(actionAdd_SVG); tbtnRemoveSVG->setDefaultAction(actionRemove_SVG); tbtnEditSVG->setDefaultAction(actionEdit_SVG); tbtnExportSVG->setDefaultAction(actionExport_SVG); QObject::connect(actionAdd_SVG, SIGNAL(triggered()), this, SLOT(addSvg())); QObject::connect(actionRemove_SVG, SIGNAL(triggered()), this, SLOT(removeSvg())); QObject::connect(actionEdit_SVG, SIGNAL(triggered()), this, SLOT(editSvg())); QObject::connect(actionExport_SVG, SIGNAL(triggered()), this, SLOT(exportSvg())); QObject::connect(SQSVGListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(previewSvg(QListWidgetItem *))); QObject::connect(SQSVGListWidget, SIGNAL(currentTextChanged(QString)), this, SLOT(currentSvgChanged())); tbtnMoveUp->setDefaultAction(actionMove_up); tbtnMoveDown->setDefaultAction(actionMove_down); QObject::connect(actionMove_up, SIGNAL(triggered()), this, SLOT(moveUp())); QObject::connect(actionMove_down, SIGNAL(triggered()), this, SLOT(moveDown())); QObject::connect(actionMove_to_top, SIGNAL(triggered()), this, SLOT(moveToTop())); QObject::connect(actionMove_to_bottom, SIGNAL(triggered()), this, SLOT(moveToBottom())); QObject::connect(actionHide, SIGNAL(triggered()), this, SLOT(hideQuestion())); QObject::connect(actionShow_hidden, SIGNAL(triggered()), this, SLOT(filterLQSearch())); rbtngrpFilterLQ = new QButtonGroup(this); rbtngrpFilterLQ->addButton(LQAllRadioButton); rbtngrpFilterLQ->addButton(LQEasyRadioButton); rbtngrpFilterLQ->addButton(LQMediumRadioButton); rbtngrpFilterLQ->addButton(LQDifficultRadioButton); rbtngrpFilterLQ->addButton(LQCategoryRadioButton); actgrpFilterLQ = new QActionGroup(this); actgrpFilterLQ->addAction(actionShow_all); actgrpFilterLQ->addAction(actionShow_easy); actgrpFilterLQ->addAction(actionShow_medium); actgrpFilterLQ->addAction(actionShow_difficult); actgrpFilterLQ->addAction(actionShow_category); QObject::connect(rbtngrpFilterLQ, SIGNAL(buttonReleased(QAbstractButton *)), this, SLOT(filterLQ(QAbstractButton *))); QObject::connect(actgrpFilterLQ, SIGNAL(triggered(QAction *)), this, SLOT(filterLQAction(QAction *))); QObject::connect(LQCategoryComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterLQCategoryChanged())); QObject::connect(LQSearchLineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(filterLQSearch())); QObject::connect(tbtnSearchByGroup, SIGNAL(released()), this, SLOT(searchByGroup())); actgrpPage = new QActionGroup(this); actgrpPage->addAction(actionEdit_questions); actgrpPage->addAction(actionEdit_comments); actgrpPage->addAction(actionEdit_categories); actgrpPage->addAction(actionEdit_test); actgrpPage->addAction(actionSaved_sessions); actgrpPage->addAction(actionEdit_classes); QObject::connect(actgrpPage, SIGNAL(triggered(QAction *)), this, SLOT(setPage(QAction *))); //QObject::connect(btnApply, SIGNAL(released()), this, SLOT(setDatabaseModified())); //QObject::connect(actionApply, SIGNAL(triggered()), this, SLOT(setDatabaseModified())); QObject::connect(ECTextEdit, SIGNAL(textChanged()), this, SLOT(setDatabaseModified())); QObject::connect(actionCheck_for_updates, SIGNAL(triggered()), this, SLOT(checkForUpdates())); QObject::connect(network_access_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(httpRequestFinished(QNetworkReply *))); QObject::connect(actionDocumentation, SIGNAL(triggered()), this, SLOT(openDocumentation())); QObject::connect(SQStatisticsLabel, SIGNAL(linkActivated(QString)), this, SLOT(adjustQuestionDifficulty())); QObject::connect(actionPrint_questions, SIGNAL(triggered()), this, SLOT(showPrintQuestionsDialogue())); QObject::connect(actionOverall_statistics, SIGNAL(triggered()), this, SLOT(overallStatistics())); QObject::connect(actionChange_language, SIGNAL(triggered()), this, SLOT(changeLanguage())); QObject::connect(mainStackedWidget, SIGNAL(currentChanged(int)), this, SLOT(currentPageChanged(int))); // Disable all ------------------------------------------------------------- setAllEnabled(false); // Categories ------------------------------------------------------------------- setupCategoriesPage(); // Server ------------------------------------------------------------------ setupServer(); // Session viewer ---------------------------------------------------------- setupSessionViewer(); // Class viewer ------------------------------------------------------------ setupClassViewer(); // ------------------------------------------------------------------------- #ifdef Q_OS_MAC show(); #endif // Load settings ----------------------------------------------------------- loadSettings(); // Ready ------------------------------------------------------------------- statusBar()->showMessage(tr("Ready"), 10000); // Check app args ---------------------------------------------------------- if (qApp->arguments().count() > 1) { openFile(qApp->arguments().at(1)); } // ------------------------------------------------------------------------- #ifndef Q_OS_MAC show(); #endif }
/*================MAIN==================*/ int main(int argc, char** argv){ if(argc != 2 && argc != 4){ printf("usage: %s [Port]\n", argv[1]); printf("usage: %s [my port] [server ipaddress] [server port]\n", argv[1]); exit(1); } //init current node, 2 predecessors, 2 successor0cessors current = mmap(NULL, sizeof(current), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); current->id = 0; current->port = 0; strcpy(current->ip, "\0"); predecessor0 = mmap(NULL, sizeof(predecessor0), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); predecessor0->id = 0; predecessor0->port = 0; strcpy(predecessor0->ip, "\0"); predecessor1 = mmap(NULL, sizeof(predecessor1), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); predecessor1->id = 0; predecessor1->port = 0; strcpy(predecessor1->ip, "\0"); successor0 = mmap(NULL, sizeof(successor0), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); successor0->id = 0; successor0->port = 0; strcpy(successor0->ip, "\0"); successor1 = mmap(NULL, sizeof(successor1), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); successor1->id = 0; successor1->port = 0; strcpy(successor1->ip, "\0"); fingerTable = mmap(NULL, sizeof(FINGERTABLE_SIZE * sizeof(finger)), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); quitUpdate = mmap(NULL, sizeof(quitUpdate),PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); *quitUpdate = 0; // CurrentInfo(argv[1]); if(argc == 2){ printf("Only two arguments.Create a new ring.\n"); createRing(argv[1]); } else{ printf("Only four arguments. Join a old ring.\n"); join(argv); } int pid0 = fork(); if (pid0 == 0){ //printf("Need a function send "IS_ALIVE" here"); } else{ if (pid0 == -1){ perror("fork"); return 1; } else{ int pid = fork(); if (pid == 0){ //printf("===MAIN: I will fork and set up server.===\n"); setupServer(argv[1]); return 0; } else{ if (pid == -1){ perror("fork"); return 1; } else{ //printf("I will deal with ui.\n"); ui(); return 0; } } return 0; } } }
static int realMain(MprCmdLine *cmdLine) { MaHttp *http; char portNumBuf[MPR_MAX_IP_PORT]; char *argp, *logSpec; int c, errflg, kill, poolThreads, outputVersion; mprSetMemHandler(memoryFailure); mprCreateMemHeap(0, 16 * 1024, MAXINT); program = mprGetBaseName(cmdLine->getArgv()[0]); poolThreads = -1; kill = errflg = 0; logSpec = 0; outputVersion = 0; autoScan = 1; background = 0; serverRoot = 0; docRoot = "web"; #if !WIN && !WINCE && !VXWORKS if (getuid()) { ipAddr = mprStrdup("4000"); } else { mprSprintf(portNumBuf, sizeof(portNumBuf), "%d", MA_SERVER_DEFAULT_PORT_NUM); ipAddr = mprStrdup(portNumBuf); } #else mprSprintf(portNumBuf, sizeof(portNumBuf), "%d", MA_SERVER_DEFAULT_PORT_NUM); ipAddr = mprStrdup(portNumBuf); #endif while ((c = cmdLine->next(&argp)) != EOF) { switch(c) { case 'A': autoScan = 0; break; case 'a': mprFree(ipAddr); ipAddr = mprStrdup(argp); break; case 'b': background++; break; case 'c': /* Ignored */ break; case 'D': mprSetDebugMode(1); break; case 'd': docRoot = argp; break; case 'f': #if BLD_FEATURE_CONFIG_PARSE configFile = argp; autoScan = 0; #else errflg++; #endif break; case 'k': kill++; logSpec = 0; break; case 'l': logSpec = (*argp) ? argp : 0; break; case 'm': mprRequestMemStats(1); break; case 'r': serverRoot = argp; break; case 't': poolThreads = atoi(argp); break; // // FUTURE -- just for test. Will be removed // case 'w': writeFile = argp; break; case 'v': outputVersion++; break; #if WIN && BLD_FEATURE_RUN_AS_SERVICE case 'i': serviceOp = MPR_INSTALL_SERVICE; if (strcmp(argp, "none") == 0) { serviceCmdLine = ""; } else if (strcmp(argp, "default") == 0) { serviceCmdLine = "-b -c -f " BLD_PRODUCT ".conf"; } else { serviceCmdLine = argp; } break; case 'g': serviceOp = MPR_GO_SERVICE; break; case 's': serviceOp = MPR_STOP_SERVICE; break; case 'u': serviceOp = MPR_UNINSTALL_SERVICE; break; #endif default: errflg++; break; } } if (errflg) { printUsage(program); return MPR_ERR_BAD_SYNTAX; } mp = new Mpr(program); mp->setAppName(BLD_PRODUCT); mp->setAppTitle(BLD_NAME); mp->setHeadless(isService || background); #if BLD_HOST_UNIX || VXWORKS initSignals(); #endif if (kill) { mp->killMpr(); delete mp; exit(0); } if (outputVersion) { printVersion(); delete mp; exit(0); } // // Create the top level HTTP service and default HTTP server // http = new MaHttp(); server = new MaServer(http, "default"); setupFileSystem(); setLogging(logSpec); // // Confirm the location of the server root // if (locateServerRoot(serverRoot) < 0) { mprError(MPR_L, MPR_USER, "Can't start server, exiting."); exit(2); } if (securityChecks(cmdLine->getArgv()[0]) < 0) { exit(3); } #if WIN #if BLD_FEATURE_RUN_AS_SERVICE if (serviceOp) { windowsServiceOps(); delete mp; return 0; } #endif if (windowsInit() < 0) { delete mp; return MPR_ERR_CANT_INITIALIZE; } #endif // // Start the MPR. This starts Timer, Socket and Pool services // if (mp->start(MPR_KILLABLE) < 0) { mprError(MPR_L, MPR_USER, "Can't start MPR for %s", mp->getAppTitle()); delete mp; return MPR_ERR_CANT_INITIALIZE; } // // Load the statically linked modules // maLoadStaticModules(); if (setupServer(http, poolThreads) < 0) { mprError(MPR_L, MPR_USER, "Can't configure the server, exiting."); exit(6); } #if BLD_FEATURE_CONFIG_SAVE if (writeFile) { server->saveConfig(writeFile); mprLog(0, "Configuration saved to %s\nExiting ...\n", writeFile); exit(0); } #endif if (http->start() < 0) { mprError(MPR_L, MPR_USER, "Can't start server, exiting."); exit(7); } else { #if LINUX && BLD_FEATURE_RUN_AS_SERVICE if (background && mp->makeDaemon(1) < 0) { mprError(MPR_L, MPR_USER, "Could not run in the background"); } else #endif { #if BLD_FEATURE_MULTITHREAD mprLog(MPR_CONFIG, "HTTP services are ready with %d pool threads\n", http->getLimits()->maxThreads); #else mprLog(MPR_CONFIG, "HTTP services are ready (single-threaded).\n"); #endif } mp->setHeadless(1); eventLoop(); mprLog(MPR_WARN, "Stopping HTTP services.\n"); http->stop(); } #if WIN if (trayIcon > 0) { closeTrayIcon(); } if (trayTimer) { trayTimer->stop(MPR_TIMEOUT_STOP); trayTimer->dispose(); trayTimer = 0; } #endif mprLog(MPR_WARN, "Stopping MPR services.\n"); mp->stop(0); maUnloadStaticModules(); delete server; delete http; delete mp; mprFree(ipAddr); #if BLD_FEATURE_ROMFS delete romFileSystem; #endif #if BLD_FEATURE_LOG mprLog(MPR_WARN, "Closing log.\n"); if (logger) { delete logger; } #if WIN if (dialog) { delete dialog; } #endif #endif return 0; }
int main ( int argc, char *argv[]) { int sock; int port; int conn[MAX_CONNS]; int dev; int screenWidth, screenHeight; fd_set fdset; int res; int i; if (argc < 2) { fprintf (stderr, "use: %s <port> -v\n", argv[0]); return 1; } port = atoi (argv[1]); if (argc > 2 && strncmp(argv[2],"-v",2) == 0) verbose = 1; getScreenSize(&screenWidth, &screenHeight); if (verbose) printf("screen size is %d X %d \n", screenWidth, screenHeight); g_screenWidth = screenWidth; g_screenHeight = screenHeight; if ((dev = openTouchDevice(device,screenWidth,screenHeight)) < 0) return 1; if (verbose) printf("openned the device %s\n",device); if ((sock = setupServer (port)) < 0) return 1; if (verbose) printf("server ready. socket is %d\n",sock); // reset all connections to not used. for (i = 0; i < MAX_CONNS; i++) { conn[i] = -1; } while (1) { if (verbose) printf("waiting for an event\n"); do { int setsize = sock; FD_ZERO(&fdset); FD_SET(sock,&fdset); for (i = 0; i < MAX_CONNS; i++) { if (conn[i] >= 0) { if (setsize < conn[i]) setsize = conn[i]; FD_SET(conn[i], &fdset); } } res = select(setsize+1, &fdset, NULL,NULL,NULL); } while (res == -1 && errno == EINTR); if (verbose) printf("processing events\n"); if (res > 0) { if (FD_ISSET(sock, &fdset)) { for (i = 0; i < MAX_CONNS; i++) { if (conn[i] < 0) { conn[i] = accept(sock, NULL, NULL); if (verbose) printf("accepting a new connection (%d:%d)\n", i,conn[i]); break; } } if (i == MAX_CONNS) fprintf(stderr,"Max cons reached\n"); } else { for (i = 0; i < MAX_CONNS; i++) { if (conn[i] >= 0 && FD_ISSET(conn[i], &fdset)) { if (verbose) printf("got a command on socket %d\n", conn[i]); if ( processCommand(conn[i],dev) == 0) { shutdown (conn[i], SHUT_RDWR); close(conn[i]); conn[i] = -1; } } } } } } close (sock); return 0; }
int main() { const int server = setupServer(); if(server == -1) { printf("Could not set up server\n"); exit(1); } printf("Listening for connections\n"); sockaddr_storage their_addr; socklen_t sin_size = sizeof their_addr; fd_set master; // master file descriptor list fd_set read_fds; // temp file descriptor list for select() FD_ZERO(&master); // clear the master and temp sets FD_ZERO(&read_fds); // add the server to the master set FD_SET(server, &master); // keep track of the biggest file descriptor int fdmax = server; // so far, it's this one int newfd; // newly accept()ed socket descriptor struct sockaddr_storage remoteaddr; // client address socklen_t addrlen; char buf[MAXDATASIZE]; // buffer for client data int nbytes; std::unordered_map<int, std::string> users; while(true) { read_fds = master; // copy it if (select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1) { perror("Select() failed"); exit(4); } // run through the existing connections looking for data to read for(int i = 0; i <= fdmax; i++) { if (FD_ISSET(i, &read_fds)) { // we got one!! if (i == server) { // handle new connections addrlen = sizeof remoteaddr; newfd = accept(server, (struct sockaddr *)&remoteaddr, &addrlen); if (newfd == -1) { perror("Accept() failed"); } else { FD_SET(newfd, &master); // add to master set if (newfd > fdmax) { // keep track of the max fdmax = newfd; } int numbytes = recv(newfd, buf, sizeof buf, 0); // get the username buf[numbytes] = '\0'; users[newfd] = buf; // add the username in the unordered_map printf("%s connected.\n", users[newfd].c_str()); } } else { // handle data from a client if ((nbytes = recv(i, buf, sizeof buf, 0)) <= 0) { // got error or connection closed by client if (nbytes == 0) { // connection closed printf("%s disconnected.\n", users[i].c_str()); } else { perror("Recv() failed"); } users.erase(i); // remove from unordered_map close(i); // bye! FD_CLR(i, &master); // remove from master set } else { // we got some data from a client buf[nbytes] = '\0'; printf("%s: %s", users[i].c_str(), buf); for(int j = 0; j <= fdmax; j++) // send to everyone! if (FD_ISSET(j, &master)) // except the server and ourselves if (j != server && j != i) if (send(j, buf, nbytes, 0) == -1) perror("Send() failed"); } } // END handle data from client } // END got new incoming connection } // END looping through file descriptors } return 0; }
//-------------------------------------------------------------- // This is a bit messy for now, quick UI implementation //-------------------------------------------------------------- void ccs::handleGui(int parameterId, int task, void* data, int length) { bool serverWasRunning = serverIsRunning; switch(parameterId) { case ccsStartStop: if(task == kofxGui_Set_Bool) { if(*(bool*)data) { if (serverIsRunning) { runServerRequest = false; ofSetWindowTitle("CCS [Stopping]"); } else { runServerRequest = true; } } } break; case ccsReset: runServerRequest = false; setupServer(); btnReset->setValue(false); runServerRequest = true; break; case ccsPort80: runServerRequest = false; srvPort = 80; btnPort80->setValue(true); btnPort888->setValue(false); btnPort8080->setValue(false); sldrPort->setValue(80); if (serverWasRunning) runServerRequest = true; break; case ccsPort888: runServerRequest = false; srvPort = 888; btnPort80->setValue(false); btnPort888->setValue(true); btnPort8080->setValue(false); sldrPort->setValue(888); if (serverWasRunning) runServerRequest = true; break; case ccsPort8080: runServerRequest = false; srvPort = 8080; btnPort80->setValue(false); btnPort888->setValue(false); btnPort8080->setValue(true); sldrPort->setValue(8080); if (serverWasRunning) runServerRequest = true; break; case ccsAutoRun: if (srvAutoStart == true) { srvAutoStart = false; btnAutoRun->setValue(false); setupFile.setValue("autorun", "false", 0); } else { srvAutoStart = true; btnAutoRun->setValue(true); setupFile.setValue("autorun", "true", 0); } setupFile.saveFile("config/ccs-config.xml"); break; case ccsLog: runServerRequest = false; if (srvLogging == true) { srvLogging = false; btnLog->setValue(false); setupFile.setValue("logging", "false", 0); } else { srvLogging = true; btnLog->setValue(true); setupFile.setValue("logging", "true", 0); } if (serverWasRunning) runServerRequest = true; setupFile.saveFile("config/ccs-config.xml"); break; case ccsDirList: runServerRequest = false; if (srvDirList == true) { srvDirList = false; btnDirList->setValue(false); setupFile.setValue("dirlist", "false", 0); } else { srvDirList = true; btnDirList->setValue(true); setupFile.setValue("dirlist", "true", 0); } if (serverWasRunning) runServerRequest = true; setupFile.saveFile("config/ccs-config.xml"); break; case ccsPort: runServerRequest = false; srvPort = sldrPort->mValue; if (serverWasRunning) runServerRequest = true; //setupFile.setValue("port", ofToString(srvPort), 0); setupFile.saveFile("config/ccs-config.xml"); break; } }