/** * @brief Run the sevrer. * @param async If the server should be run on a seperate thread (default * true) */ void IServer::run(bool async) { if (async) m_thread = boost::thread(&IServer::execServer, this); else execServer(); }
int main(int argc, char *argv[]) { int pidFork; int i; int S[3], pid; socklen_t clilen; struct sockaddr_in serv_addr, cli_addr; signal(SIGCHLD,SIG_IGN); for (i=0; i<3; i++) { S[i] = socket(AF_INET, SOCK_STREAM, 0); if (S[i] < 0) error("ERROR opening socket!\n"); fcntl(S[i], F_SETFL, O_NONBLOCK); bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(PORT1+i); if (bind(S[i], (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) error("ERROR on binding!\n"); listen(S[i],5); } clilen = sizeof(cli_addr); if ((pidFork = fork()) == 0) { while(1) { int i=0; for (i=0; i<3; i++) { int NS; if((NS = accept(S[i], (struct sockaddr *) &cli_addr, &clilen)) >0 ) { pid = fork(); if (pid < 0) error("ERROR on fork"); if (pid == 0) { close(S[i]); if (i == 0) timeServer(NS); if (i == 1) fileServer(NS); if (i == 2) execServer(NS); exit(0); }else close(NS); } } } } return (0); }