Beispiel #1
0
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;
}
Beispiel #2
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;
}
Beispiel #3
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();
		 }
}
}