int CommunicationServer::process_dispatcher(void) { // int reuse_addr = 1, reuse_port = 1; // sock = socket(AF_INET, SOCK_STREAM, 0); if(sock < 0) { perror("socket"); exit(-1); } // setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse_addr, sizeof(reuse_addr)); setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &reuse_port, sizeof(reuse_port)); setnonblocking(sock); // struct sockaddr_in server_address; memset((char *) &server_address, 0, sizeof(server_address)); server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = htonl(INADDR_ANY); server_address.sin_port = 6669; // if(bind(sock, (struct sockaddr *) &server_address, sizeof(server_address)) < 0) { perror("bind"); close(sock); exit(-1); } // listen(sock, 1024); printf("process_dispatcher() up and running.\n\r"); int highsock = sock; // memset((char *) &connectlist, 0, sizeof(connectlist)); // struct timeval timeout; int readsocks; while(1) { handle_new_connection(); // build_select_list(); // timeout.tv_sec = 0; timeout.tv_usec = 32; // readsocks = select(highsock + 1, &socks, (fd_set *) 0, (fd_set *) 0, &timeout); // if(readsocks < 0) { perror("select"); continue; } if(readsocks == 0) { //printf("process_dispatcher() ticking ..\n\r"); // write //handle_new_connection(); } else { printf("select returned > 0\n\r"); read_socks(); } } return 0; }
int acceptForClient() { int readsocks=0; struct timeval timeout; while (1) { /* Main server loop - for accept connect*/ build_select_list(); timeout.tv_sec=0; timeout.tv_usec = 0; readsocks = select(highsock+1, &socks, (fd_set *) 0, (fd_set *) 0,&timeout); if (readsocks < 0) { perror("select"); exit(EXIT_FAILURE); } if (readsocks == 0) { /* Nothing ready to read, just show that we're alive */ //printf("."); fflush(stdout); } else{ printf("read_socks .....\n"); //system("clear"); if(checkConnectionLost_connectList()>0) read_socks();//for accept else { printf("gd2\n"); read_socks();//for relogin printf("indexMax=%d\n",indexMax); if(indexMax==BACKLOG && 0==checkConnectionLost()) break; } } } /* while(1) */ printf("Yeah, already to go.\n"); //write_socks("START"); return 0; }
int main(int argc, char *argv[]) { char scrap[500],bindto[128]; struct hostent *myself; struct itimerval timers; struct itimerval oldtimers; struct sigaction sig; struct timeval timeout; /* Timeout for select */ int readsocks; /* Number of sockets ready for reading */ int i, i2, addr_len; int sock; int reuse_addr = 1, bind_to_other = 0; int broadcast_enable = 1; /* sort of senseless without */ long utime; /* Suck in command line options */ if (argc > 1) { /* something was passed */ for(i=1;i<argc;i++) { if (strcmp("-g", argv[i]) == 0) { sscanf(argv[i+1], "%d", &groupid); if (groupid < 1) { printf("sntsd: group must be > 0\n"); exit(1); } i++; /* so the for isn't called and the # considered a bad option */ } else if (strcmp("-a", argv[i]) == 0) { sscanf(argv[i+1], "%s", &bindto); bind_to_other=1; if (strlen(bindto)>16) { /* Just checking for too long input */ printf("sntsd: IP address is too long\n"); exit(1); } i++; } else if (strcmp("-i", argv[i]) == 0) { i++; } else { printf("sntsd: bad command line option %s.\n", argv[i]); exit(1); } } } /* this is to allow for multiple hosts on the same group. If twice the interval is reached, the host is assumed down and this host starts broadcasting */ bcast_server_interval = bcast_interval * 2; /* Get socket */ sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock == -1) { perror("socket"); exit(1); } /* So that we can re-bind to it without TIME_WAIT problems */ setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse_addr,sizeof(reuse_addr)); /* Broadcast enable */ setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &broadcast_enable, sizeof(broadcast_enable)); /* Set socket to non-blocking with our setnonblocking routine */ setnonblocking(sock); memset((char *) &server_address, 0, sizeof(server_address)); server_address.sin_family = AF_INET; if (bind_to_other == 0) server_address.sin_addr.s_addr = htonl(INADDR_ANY); else server_address.sin_addr.s_addr = inet_addr(bindto); server_address.sin_port = htons(SNTSPORT); if (bind(sock, (struct sockaddr *) &server_address, sizeof(server_address)) < 0 ) { perror("bind"); close(sock); exit(1); } /* Daemon ourselves */ daemon(1,1); //signal(SIGALRM, timebcast); /* Linux doesn't like "signal" :( */ sig.sa_handler = &timebcast; sig.sa_flags = SA_RESTART; sigaction(SIGALRM, &sig, NULL); oldtimers.it_interval.tv_sec = bcast_interval; oldtimers.it_value.tv_sec = bcast_interval; timers.it_interval.tv_sec = bcast_interval; timers.it_value.tv_sec = bcast_interval; if(setitimer(ITIMER_REAL, &timers, NULL)) { printf("Failure setting timer (blame Linux)\n"); exit(1); } /* Get info on myself or use passed IP address */ if (bind_to_other == 0) { /* Lookup my IP */ i = gethostname(scrap, sizeof(scrap)); myself = gethostbyname(scrap); if (myself == NULL) { syslog(LOG_ERR, "Can't lookup my own IP - quiting"); exit(1); } sprintf(myip, "%s", inet_ntoa(*((struct in_addr *)myself->h_addr))); } else sprintf(myip,"%s",bindto); /* Use specified IP */ /* syslog starting message */ sprintf(scrap, "sntsd version %s proto version %s starting up", VERSION, PROTOVERSION); syslog(LOG_NOTICE, scrap); sprintf(scrap, "starting using groupid: %d", groupid); syslog(LOG_NOTICE, scrap); sprintf(scrap, "using IP: %s",myip); syslog(LOG_NOTICE, scrap); udp_socket = sock; bcast.sin_family = AF_INET; bcast.sin_addr.s_addr = inet_addr(BCAST_ADDR); bcast.sin_port = htons(SNTSPORT); time(&starttime); /* pick random sequence number */ #ifdef COMPAT_SRANDOM time(&utime); srandom(utime); #else srandomdev(); /* init using /dev/urandom on systems which have it */ #endif picknewsequence(); /* Send 'master coming up' message */ sprintf(outmessage, "snts %s %d hostup", PROTOVERSION, groupid); sendto(udp_socket, outmessage, sizeof(outmessage), 0, (struct sockaddr *)&bcast, sizeof(bcast)); while (1) { /* i=recvfrom(udp_socket, message, sizeof(message), 0, (struct sockaddr *)&their_addr, &addr_len); */ timeout.tv_sec = 10; timeout.tv_usec = 0; build_select_list(); readsocks = select(udp_socket+1, &socks, (fd_set *) 0, (fd_set *) 0, &timeout); if (readsocks == 0) { } else if (readsocks > 0) { i=recvfrom(udp_socket, message, sizeof(message), 0, (struct sockaddr *)&their_addr, &addr_len); message[i] = '\0'; process_message(); } } }