コード例 #1
0
ファイル: server.c プロジェクト: yaoshuyin/tree
int main(void)
{
    fd_set active_fd_set, read_fd_set;
    int i;
    struct sockaddr_in clientname;

    socklen_t size;
    int sock = make_socket(PORT);

    if(listen(sock, 1) < 0)
    {
        perror("listen");
        exit(EXIT_FAILURE);
    }

    FD_ZERO(&active_fd_set);
    FD_SET(sock,&active_fd_set);

    while(1)
    {
        read_fd_set = active_fd_set;

        if(select(FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0)
        {
            perror("select");
            exit(EXIT_FAILURE);
        }

        for(i=0; i<FD_SETSIZE; ++i)
        {
            if(FD_ISSET(i, &read_fd_set))
            {
                if(i == sock)
                {
                    int newc;
                    size = sizeof(clientname);
                    newc = accept(sock, (struct sockaddr *) &clientname, &size);
                    if(newc < 0)
                    {
                        perror("accept");
                        exit(EXIT_FAILURE);
                    }
                    fprintf(stderr, "connect from host %s, port %hd.\n", inet_ntoa(clientname.sin_addr), ntohs(clientname.sin_port));
                    FD_SET(newc, &active_fd_set);
                }
                else
                {
                    if(read_from_client(i)<0)
                    {
                        close(i);
                        FD_CLR(i, &active_fd_set);
                    }
                }
            }
        }
    }


    return 0;
}
コード例 #2
0
ファイル: handle_callbacks.c プロジェクト: Bridouille/zappy
int		handle_client(t_selfd *fd, t_server *serv)
{
  char		*cmd;
  int		r;
  ssize_t      	swr;

  if (ISREADABLE(fd))
    {
      if (((r = read_from_client(fd)) < 0 && errno != EINTR) || (r == 0))
        {
          log_connection(((t_client *)fd->data)->sock,
                         "Client disconnected from:");
          return (destroy_connection(serv, fd));
        }
    }
  if (ISWRITEABLE(fd) && (r = write_to_client(fd)) < 0 && errno != EINTR)
    return (destroy_connection(serv, fd));
  while ((cmd = get_command(fd)))
    handle_add_cmd(serv, fd, cmd);
  swr = ring_buffer_left_read(fd->wbuff);
  if (!swr && fd->to_close)
    return (destroy_connection(serv, fd));
  if (swr)
    CHECKWRITE(fd);
  CHECKREAD(fd);
  push_instruction(serv, fd);
  return (0);
}
コード例 #3
0
ファイル: incoming.c プロジェクト: 2asoft/freebsd
apr_status_t serf__process_client(serf_incoming_t *client, apr_int16_t events)
{
    apr_status_t rv;
    if ((events & APR_POLLIN) != 0) {
        rv = read_from_client(client);
        if (rv) {
            return rv;
        }
    }

    if ((events & APR_POLLHUP) != 0) {
        return APR_ECONNRESET;
    }

    if ((events & APR_POLLERR) != 0) {
        return APR_EGENERAL;
    }

    if ((events & APR_POLLOUT) != 0) {
        rv = write_to_client(client);
        if (rv) {
            return rv;
        }
    }

    return APR_SUCCESS;
}
コード例 #4
0
ファイル: http-server.c プロジェクト: rubacalypse/chttpd
int main(int argc, char* argv[]) {
  fd_set active_set, read_set; 
  int port = atoi(argv[1]);
  int sock_fd = open_socket();
  bind_socket(sock_fd, port);
  listen_socket(sock_fd, 5);
  FD_ZERO(&active_set);
  FD_SET(sock_fd, &active_set);

  while(1) {
    read_set = active_set;
    if (select(FD_SETSIZE, &read_set, NULL, NULL, NULL) < 0) {
      perror("select error");
      exit(EXIT_FAILURE);
    }

    for (int i = 0; i < FD_SETSIZE; i++) {
      if (FD_ISSET(i, &read_set)) {
        if (i == sock_fd) {
          int accepted_fd = accept_connection(sock_fd);
          FD_SET(accepted_fd, &active_set);
        } else {
          if (read_from_client(i) < 0) {
            close_socket(i);
            FD_CLR(i, &active_set);
          }
        }
      }
    }
  }
  return 0;
}
コード例 #5
0
ファイル: jsh.c プロジェクト: MichaelBruening/clusterit-mib
char *
check_node(void)
{
    char *buf;
    int sock, i;
    struct sockaddr_in name;
    struct hostent *hostinfo;

    /* create socket */
    sock = socket(PF_INET, SOCK_STREAM, 0);
    if (sock < 0)
	bailout();

    name.sin_family = AF_INET;
    name.sin_port = htons(oportnum);
    hostinfo = gethostbyname(jsd_host);

    if (hostinfo == NULL) {
	(void)fprintf(stderr, "Unknown host %s.\n", jsd_host);
	exit(EXIT_FAILURE);
    }

    name.sin_addr = *(struct in_addr *)hostinfo->h_addr;

    if (connect(sock, (struct sockaddr *)&name, sizeof(name)) < 0)
	bailout();

    i = read_from_client(sock, &buf); /* get a node */
    buf[i] = '\0';
    if (debug)
	printf("Got node %s\n", buf);
    (void)close(sock);

    return(buf);
}
コード例 #6
0
ファイル: server.c プロジェクト: Meldanor/Gnuddels
int
handle_client(int socket) {

    // Get the client registered to the socket
    Client *client = search_client(socket);
    if (client == NULL) {
        perror("Unregistered client socket found! This is not in the list!");
        return EXIT_FAILURE;
    }
    // Read the complete input of the client
    int res = read_from_client(client);
    if (res != EXIT_SUCCESS)
        return res;
        
    // Try to extract a single message from the buffer
    StringBuffer *msg = extract_message(client);
    if (msg == NULL) {
        return EXIT_SUCCESS;
    }
    if (is_command(client, msg) == EXIT_SUCCESS) {
        handle_command(client, msg);
    }
    else {
        broadcast_message(client, msg);
    }
    
    StringBuffer_free(msg);
    return EXIT_SUCCESS;
}
コード例 #7
0
int main(int argc , char *argv[])
{
    Maintainer maintainer;
    init_maintainer(&maintainer);
    logger("<Server><main>maintainer initialized\n");
    int opt = TRUE;

    if((maintainer.master_socket=socket(AF_INET, SOCK_STREAM, 0))==0){
        logger("<Server><main>failed at master socket creation\n");
        return 1;
    }

    fcntl(maintainer.master_socket, F_SETFL, O_NONBLOCK);

    if(setsockopt(maintainer.master_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt)) < 0){
        logger("<Server><main>failed at master socket reuse\n");
        return 1;
    }

    if(bind(maintainer.master_socket, (struct sockaddr *)&(maintainer.address), sizeof(maintainer.address)) < 0){
        logger("<Server><main>failed at master socket binding\n");
        return 1;
    }

    if (listen(maintainer.master_socket, 10) < 0){
        logger("<Server><main>failed at master socket listen");
        return 1;
    }

    FD_SET(maintainer.master_socket, &(maintainer.fd_read_set));
    maintainer.max_sd = maintainer.master_socket;

    while(TRUE){
        maintainer.fd_read_set_select = maintainer.fd_read_set;
        if ((select(maintainer.max_sd+1, &(maintainer.fd_read_set_select),NULL,NULL, NULL) < 0))
            logger("<Server><main>error at select\n");
        if (FD_ISSET(maintainer.master_socket, &(maintainer.fd_read_set_select)))
            handle_new_client(&maintainer);
        for(int i=0; i<MAX_CLIENTS; ++i){
            int current_socket = maintainer.clients[i].socket_fd;
            if(current_socket == -1)
                continue;
            if(FD_ISSET(current_socket, &(maintainer.fd_read_set_select)))
                read_from_client(&maintainer, current_socket,&(maintainer.clients[i]));
        }
    }
    return 0;
}
コード例 #8
0
ファイル: chat_server.cpp プロジェクト: Ryannnnnnn/toys
void chat_server() {
    int sockfd = make_passive_socket_tcp(SERV_PORT, SERV_BACKLOG); // make a TCP socket

    fd_set active_fds;
    fd_set read_fds;

    struct sockaddr_in client_addr;
    int i;

    // Initialize
    FD_ZERO(&active_fds);
    FD_SET(sockfd, &active_fds);

    while (1) {
        memcpy(&read_fds, &active_fds, sizeof(read_fds));

        if (select(FD_SETSIZE, &read_fds, (fd_set *)NULL, (fd_set *)NULL,
                   (struct timeval *)NULL) < 0) {
            perror("call select() error");
            exit(1);
        }

        // Connections on original socket
        if (FD_ISSET(sockfd, &read_fds)) {
            int new_socket;
            socklen_t size;

            size = sizeof (client_addr);
            new_socket = accept(sockfd, (struct sockaddr *)&client_addr, &size);
            if (new_socket < 0) {
                perror("call accept() error");
                exit(1);
            }
            FD_SET(new_socket, &active_fds);
        }
        for (i = 0; i < FD_SETSIZE; i++)
            if (i != sockfd && FD_ISSET(i, &read_fds)) {
                // Data arriving on already connected socket
                if (read_from_client(i)) {
                    close(i);
                    FD_CLR(i, &active_fds);
                }
            }
    }
}
コード例 #9
0
ファイル: select.c プロジェクト: moul/junk
void	check_fdset(fd_set *rfds, fd_set *wfds, t_mgs_context *context)
{
  t_mgs_client	*tmp;

  if (FD_ISSET(context->fd, rfds))
    accept_mgs_new_client(context);
  tmp = context->clients;
  while (tmp)
    {
      if (tmp->fd >= 0)
	{
	  if (FD_ISSET(tmp->fd, rfds))
	    if (read_from_client(tmp))
	      return ;
	  if (tmp->buffout != NULL && FD_ISSET(tmp->fd, wfds))
	    write_to_client(tmp);
	}
      tmp = tmp->next;
    }
  return ;
}
コード例 #10
0
ファイル: jsh.c プロジェクト: MichaelBruening/clusterit-mib
void
free_node(char *nodename)
{
    int sock;
    char *buf;
    struct sockaddr_in name;
    struct hostent *hostinfo;

    /* create socket */
    sock = socket(PF_INET, SOCK_STREAM, 0);
    if (sock < 0)
	bailout();

    name.sin_family = AF_INET;
    name.sin_port = htons(iportnum);
    hostinfo = gethostbyname(jsd_host);

    if (hostinfo == NULL) {
	(void)fprintf(stderr, "Unknown host %s.\n", jsd_host);
	exit(EXIT_FAILURE);
    }

    name.sin_addr = *(struct in_addr *)hostinfo->h_addr;

    if (connect(sock, (struct sockaddr *)&name, sizeof(name)) < 0)
	bailout();

    if (debug)
	printf("Freeing node %s\n", nodename);
    read_from_client(sock, &buf);
    /* we just ignore the contents, so free it */
    free(buf);
    if (write_to_client(sock, nodename) != 0)
	bailout();
    if (debug)
	printf("freed node %s\n", nodename);
    (void)close(sock);
}
コード例 #11
0
int main(int argc , char *argv[])
{
    Maintainer* maintainer = mymalloc(sizeof(Maintainer));
    init_maintainer(maintainer);
    logger("<Server><main>maintainer initialized\n");
    int opt = TRUE;

    if((maintainer->master_socket=socket(AF_INET, SOCK_STREAM, 0))==0) {
        logger("<Server><main>failed at master socket creation\n");
        myfree(maintainer);
        exit(EXIT_FAILURE);
    }

    fcntl(maintainer->master_socket, F_SETFL, O_NONBLOCK);

    if(setsockopt(maintainer->master_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt)) < 0) {
        logger("<Server><main>failed at master socket reuse\n");
        myfree(maintainer);
        exit(EXIT_FAILURE);
    }

    if(bind(maintainer->master_socket, (struct sockaddr *)&(maintainer->address), sizeof(maintainer->address)) < 0) {
        logger("<Server><main>failed at master socket binding\n");
        myfree(maintainer);
        exit(EXIT_FAILURE);
    }

    if (listen(maintainer->master_socket, 10) < 0) {
        logger("<Server><main>failed at master socket listen");
        exit(EXIT_FAILURE);
    }

    FD_SET(maintainer->master_socket, &(maintainer->fd_read_set));
    FD_SET(maintainer->master_socket, &(maintainer->fd_exception_set));
    maintainer->max_sd = maintainer->master_socket;

    while(TRUE) {
        maintainer->fd_read_set_select = maintainer->fd_read_set;
        maintainer->fd_write_set_select = maintainer->fd_write_set;
        maintainer->fd_exception_set_select = maintainer->fd_exception_set;
        if ((select(maintainer->max_sd+1, &(maintainer->fd_read_set_select),
                    &(maintainer->fd_write_set_select),
                    &(maintainer->fd_exception_set_select), NULL) < 0))
            logger("<Server><main>error at select\n");
        if (FD_ISSET(maintainer->master_socket, &(maintainer->fd_read_set_select)))
            handle_new_client(maintainer);
        if (FD_ISSET(maintainer->master_socket, &(maintainer->fd_exception_set_select)))
            handle_server_exception(maintainer);
        struct Nodes_ll* prev = maintainer->clients;
        struct Nodes_ll* iterator = maintainer->clients;
        while(iterator != NULL) {
            int current_socket = iterator->node->socket_fd;
            if(FD_ISSET(current_socket, &(maintainer->fd_exception_set_select)))
                close_client_connection(maintainer, current_socket, iterator->node, TRUE);
            else if(FD_ISSET(current_socket, &(maintainer->fd_read_set_select)))
                if(!read_from_client(maintainer, current_socket, iterator->node))
                    if(FD_ISSET(current_socket, &(maintainer->fd_write_set_select)))
                        write_to_client(maintainer, current_socket, iterator->node);
                    else if(FD_ISSET(current_socket, &(maintainer->fd_write_set_select)))
                        write_to_client(maintainer, current_socket, iterator->node);
            if(iterator != maintainer->clients) {
                if(iterator->node->socket_fd == -1) {
                    prev->next = iterator->next;
                    myfree(iterator->node);
                    struct Nodes_ll* tmp = iterator;
                    iterator = iterator->next;
                    myfree(tmp);
                }
                else {
                    prev = prev->next;
                    iterator = iterator->next;
                }
            } else if(iterator->node->socket_fd == -1) { /*marked for deletation*/
                maintainer->clients = iterator->next;
                myfree(iterator->node);
                struct Nodes_ll* tmp = iterator;
                iterator = iterator->next;
                myfree(tmp);
            } else
                iterator = iterator->next;
        }
    }
    myfree(maintainer);
    return 0;
}
コード例 #12
0
int main(int argc, char *argv[]) 
{  
   int retval,yes=1;
   long curtime;
   unsigned int serverlen, clientlen;
   struct sockaddr_in server,client,clientname;
   struct hostent *rem;
   size_t size;
   sigset_t intmask;
   struct sigaction sigchild_action,act_stop;

   if (argc < 4  || atoi(argv[2])<1 || atof(argv[3])<0.00 || atof(argv[3])>1.00) { // Check arg's //
      printf("Usage:name TCP port number NUMCHILDREN>=1\n");
      return 1; }
   NUMCHILDREN=atoi(argv[2]);
   if (pipe(fd)==-1) {                        // Create pipe//
      perror("pipe");
      return 1; }
   if ((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) { //Create socket for TCP communication-passive// 
      perror("parent:socket");                         //communication endpoint                    //
      return 1; }
   port = atoi(argv[1]);                       // Convert port number to integer //
   server.sin_family = PF_INET;                // Internet domain //
   server.sin_addr.s_addr = htonl(INADDR_ANY); // My Internet address //
   server.sin_port = htons(port);              // The given port //
   while ( (retval=setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)))==-1 && errno==EINTR );
   if ( (retval)>0){
      perror("Reusing ADDR failed");//option in order to reuse immediately port//
      return 1;}
   while( (retval=bind(sock,(struct sockaddr *)&server,sizeof(server) ))==-1 && errno==EINTR);
   if (retval < 0) {// Bind socket to address //
      perror("bind");
      return 1; }
   if (listen(sock, 5) < 0) { // Set up queue for incoming connections. //
      perror("parent:listen");
      return 1; }
   parent_pid=getpid();

   for(i=0;i<NUMCHILDREN;i++)
      if ((pid_code[i]=pid=fork())<=0) // Create children processes //
         break;

   if ( pid==0 ){//childcode//
      curtime = time(NULL);
      srand((unsigned int) curtime);
      probFail=atof(argv[3]);
      fprintf(stderr,"child:%ld is born and ready\n",(long)getpid());
      act_stop.sa_handler=timeToStop;     //handler for act_stop//
      act_stop.sa_flags=0;
      if ((sigemptyset(&act_stop.sa_mask ) == -1) || (sigaction(SIGUSR1,&act_stop,NULL) == -1 ) ){
         perror("FAIL TO INSTAL  SIGNAL HANDLER FOR SIGUSR1");//install handler for SIGUSR1//
         return 1;}
      if ((sigemptyset(&intmask) == -1) || (sigaddset(&intmask,  SIGPIPE) == -1)){//create signal mask//
         perror("Failed to initialize the signal mask");
         return 1;}
      if (sigprocmask(SIG_BLOCK, &intmask, NULL) == -1){  //ignore the signal of intmask//
         perror("Failed to block SIGPIPE");
         return 1;}
      close(fd[WRITE]);//close unnecessary writing end//
      ready=0; 
      command_count=0;
      while(1){
          srand((unsigned int) curtime);
          bzero(temp,sizeof(temp));
          while( (bytesread=read(fd[READ], temp, sizeof(temp)+1))==-1 && errno==EINTR );
          if (bytesread < 0 ){
             perror("child:read");//read from pipe-parent writter//
             return 1;}
          i=j=0;
          bzero(dgr_port,sizeof(dgr_port));//figure out DGR port//
          do{
            ch=dgr_port[j]=temp[j++];
          }while(ch!='\n');
          port=atoi(dgr_port);
          bzero(name,sizeof(name));//figure oudt client's name//
          i=0;
          do{
            if(temp[j]==' ')
              break;
            name[i++]=temp[j++];
          }while(1);
          i=0;
          j++;
          bzero(command,sizeof(command));//figure out command//
          while(1){
             if (temp[j]=='\0')
                break;
             ch=command[i++]=temp[j++];
          }
          fprintf(stderr,"child:%ld is going to execute command:%s- for client:%s\n",
                   (long)getpid(),command,name);
          server.sin_family = PF_INET; // Internet domain //
          server.sin_port = htons(port); // Server's Internet address and port //
          if ((rem = gethostbyname(name)) == NULL) { // Find client's address //
             perror("child:gethostbyname");
             return 1; }
          if ((dgr_sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0) { // Create socket //
             perror("child:socket");
             return 1; }
          bcopy((char *) rem -> h_addr, (char *) &server.sin_addr,rem -> h_length);
          client.sin_family = PF_INET; // Internet domain //
          client.sin_addr.s_addr = htonl(INADDR_ANY); // My Internet address //
          client.sin_port = htons(0); // Select any port //
          while ( (retval=setsockopt(dgr_sock,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)))==-1 && errno==EINTR );
          if ( (retval)>0){
             perror("Reusing ADDR failed");//option in order to reuse immediately port//
             return 1;}
          while( (retval=bind(dgr_sock,(struct sockaddr *)&client,sizeof(client)))==-1 && errno==EINTR);
          if (retval < 0) {// Bind socket to address //
             perror("bind");
             return 1; }
          ready=1;
          if (strcmp(command,"end ")==0){  //do you catch end?//
             if (sendto(dgr_sock, "all",strlen("all"),0,(struct sockaddr *)&server,sizeof(server)) < 0) {
                perror("3 sendto");
                exit(1); }
             close(fd[READ]);//close your fd'ds//
             close(dgr_sock);
             fprintf(stderr,"child:%ld closing its fd's and killing itself\n",(long)getpid());
             if ( kill(getppid(),SIGUSR2) ||  kill(getpid(),SIGTERM)){//send signal to parent //
                perror("kill");                                     //and then kill yourself//
                return 1;}
             return 0;
          }
          if (strcmp(command,"timeToStop ")==0){//do you catch timeToStop?//
             fprintf(stderr,"time to stop\n");
             if (kill(getppid(),SIGUSR1)){//send signal to parent //
                perror("kill");
                return 1;}
             sleep(1);
             break;//break so as not to execute command TimeToStop which doesn't exist//
          }
          if ( (fp = popen(command, "r"))==NULL ){
             perror("popen:");//open file and execute command//
             return 1;}
          bzero(PID_COMMAND,sizeof(PID_COMMAND));
          sprintf(PID_COMMAND,"%s:%ld:results:\n",command,getpid());//PID:COMMAND//            
          bzero(temp,sizeof(temp));
          j=i=packets=0;
          first=1;
          while((ch= getc(fp)) != EOF ){
             temp[i++]=ch;
             sent_flag=0;
             if ( i==(BUFSIZE-1)){
                if (first && ((float)(rand()%100+1))>(100*probFail)){
                   while ((retval=sendto(dgr_sock,PID_COMMAND,sizeof(PID_COMMAND)+1,0,(struct sockaddr *)&server,sizeof(server)))==-1 
                          && (errno==EINTR));
                   if (retval < 0) {
                      perror("1 sendto");//PID:COMMAND//
                      return 1; } 
                   first=0;
                }
                if (((float)(rand()%100+1))>(100*probFail)){
                   while ((retval=sendto(dgr_sock,temp,sizeof(temp),0,(struct sockaddr *)&server,sizeof(server)))==-1 
                         &&(errno==EINTR));
                   if (retval < 0) {
                      perror("1 sendto"); 
                      return 1; } //RESULTS//
                   packets++;
               }
                bzero(temp,sizeof(temp));
                sent_flag=1;
                i=0;
             }
          }
          if (sent_flag!=1 && ((float)(rand()%100+1))>(100*probFail)){
             if (first && ((float)(rand()%100+1))>(100*probFail)){
                while( (retval=sendto(dgr_sock,PID_COMMAND,sizeof(PID_COMMAND)+1,0,(struct sockaddr *)&server,sizeof(server)))==-1 
                       && (errno==EINTR));//PID:COMMAND//
                   if (retval < 0) {
                      perror("1 sendto");
                      return 1; }
                   first=0;
             }
             while((retval=sendto(dgr_sock,temp,sizeof(temp),0,(struct sockaddr *)&server,sizeof(server)))==-1 &&(errno==EINTR));
             if (retval < 0) {
                perror("2 sendto");
                return 1;} //RESULTS//
             packets++;
          }
          if (((float)(rand()%100+1))>(100*probFail)){
             while ((retval=sendto(dgr_sock,"all",strlen("all"),0,(struct sockaddr *)&server,sizeof(server)))==-1 
                      &&(errno==EINTR));
             if (retval <0) {
                perror("1 sendto");//send phrase for end of packets//
                return 1; } 
          }
          fprintf(stderr,"packets send:%d\n\n",packets);
          close(dgr_sock);
          pclose(fp);
          command_count++;
      }   
   }
   else{//father code//
      printf("big papa is borned and ready with pid:%ld\n",(long)getpid());
      close(fd[READ]);//close unnecessary readind end//
      FD_ZERO (&active_fd_set);
      FD_SET (sock, &active_fd_set);
      if ((sigemptyset(&intmask) == -1) || (sigaddset(&intmask,  SIGPIPE) == -1)){//create signal mask//
         perror("Failed to initialize the signal mask");
         return 1;}
      if (sigprocmask(SIG_BLOCK, &intmask, NULL) == -1){  //ignore the signal of intmask//
         perror("Failed to block SIGPIPE");
          return 1;}
      act_stop.sa_handler=timeToStop;     //TimeToStop handler//
      act_stop.sa_flags=0;
      if ((sigemptyset(&act_stop.sa_mask ) == -1) || (sigaction(SIGUSR1,&act_stop,NULL) == -1 ) ){
         perror("FAIL TO INSTAL  SIGNAL HANDLER FOR SIGUSR1");//install handler for SIGUSR1//
          return 1;}
      sigchild_action.sa_handler = clean_up_children_process;//clean_up_child_process handler//
      sigchild_action.sa_flags=0;
      if ((sigemptyset(&sigchild_action.sa_mask ) == -1) || (sigaction(SIGUSR2,&sigchild_action,NULL) == -1 ) ){
         perror("FAIL TO INSTAL  SIGNAL HANDLER FOR SIGUSR2");//install handler for SIGUSR@//
         return 1;}
      do{
         read_fd_set = active_fd_set;
         while((retval=(select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL))==-1) && errno==EINTR); 
            if (retval < 0){
               perror ("parent::select");//wait untill one or more fd's become ready//
               return 1;}
         for (i = 0; i < FD_SETSIZE; ++i){//for each fd//
            if (FD_ISSET (i, &read_fd_set) ){//belong to the set?//
               if (i == sock){//we have new request for conection to thr listening sockets//
                  size = sizeof (clientname);
                  clientlen = sizeof client;
                  if ((newsock = accept(sock, (struct sockaddr *)&client, &clientlen)) < 0) {
                     perror("parent:accept");//accept and create active communication endpoint//
                     return 1; }
                  if ((rem = gethostbyaddr((char *) &client.sin_addr.s_addr,sizeof
                             (client.sin_addr.s_addr),client.sin_family)) == NULL){
                     perror("parent:gethostbyaddr");
                     return 1; }
                  fprintf(stderr,"Accepted TCP connection from listening port:%d to newsock:%d from:%s\n",
                        (port),(newsock),(rem -> h_name), client.sin_port);
                  FD_SET (newsock, &active_fd_set);//and to active set//
               }
               else{//we have new data to a connected client//
                  size = sizeof (clientname);
                  clientlen = sizeof client;
                  getpeername(i,(struct sockaddr *) &client,&clientlen);//get client's name connected to sock//
                  if ((rem = gethostbyaddr((char *) &client.sin_addr.s_addr,sizeof
                         (client.sin_addr.s_addr),client.sin_family)) == NULL){
                     perror("parent:gethostbyaddr");
                     return 1;}                 
                  if (read_from_client (i,rem) < 0){//client no more connected//
                     fprintf(stderr,"client:%s is no more connected...i am going to close unused filedescripitor:%d\n",
                         (rem -> h_name),i);
                     close (i);
                     FD_CLR (i, &active_fd_set);}//remove from active set//
               }
            }
        }
      }while(1);
   }
   return 1;
}
コード例 #13
0
ファイル: server.c プロジェクト: Aishuu/eurecom-os-server
int main (int argc, char **argv) {

    struct sockaddr_rc loc_addr = { 0 }, rem_addr = { 0 };
    int serverSock, fdmax, i;
    socklen_t opt = sizeof(rem_addr);
    fd_set read_fd_set;

    char buf[MAXMSG+1] = { 0 };

    struct team teams [MAXTEAM];
    memset(teams, 0, MAXTEAM * sizeof(struct team));

    if (argc < 2 || argc > 3) {
        fprintf (stderr, "Usage: %s teamFile [ouputFile]\n", argv[0]);
        exit (EXIT_FAILURE);
    }

    if (argc == 3) {
        out = fopen (argv[2], "w");
        
        if (out == NULL) {
            fprintf (stderr, "Could not open file %s.\n", argv[2]);
            exit (EXIT_FAILURE);
        }
    }

    srand(time(NULL));

    printf ("\n\n");
    printf (KRED    "                                           )  (      (                            \n");
    printf (        "                                        ( /(  )\\ )   )\\ )                         \n");
    printf (        "       (     (  (     (           )     )\\())(()/(  (()/(   (  (    )     (  (    \n");
    printf (        "       )\\   ))\\ )(   ))\\ (  (    (     ((_)\\  /(_))  /(_)) ))\\ )(  /((   ))\\ )(   \n");
    printf (        "      ((_) /((_|()\\ /((_))\\ )\\   )\\  '   ((_)(_))   (_))  /((_|()\\(_))\\ /((_|()\\  \n");
    printf (RESET   "      | __" KRED "(_))( ((_|_)) ((_|(_)_((_))   " RESET "/ _ \\/ __|  / __|" KRED "(_))  ((_))((_|_))  ((_) \n");
    printf (RESET   "      | _|| || | '_/ -_) _/ _ \\ '  \\" KRED "() " RESET "| (_) \\__ \\  \\__ \\/ -_)| '_\\ V // -_)| '_| \n");
    printf (        "      |___|\\_,_|_| \\___\\__\\___/_|_|_|   \\___/|___/  |___/\\___||_|  \\_/ \\___||_|  \n");
    printf ("\n\n");

    // create server socket
    printf ("Creating server socket...                                                    ");
    fflush (stdout);
    serverSock = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);

    // bind socket to port 1 of the first available local bluetooth adapter
    loc_addr.rc_family = AF_BLUETOOTH;
    loc_addr.rc_bdaddr = *BDADDR_ANY;
    loc_addr.rc_channel = (uint8_t) 1;
    bind(serverSock, (struct sockaddr *) &loc_addr, sizeof (loc_addr)); 

    // put socket into listening mode
    listen(serverSock, MAXTEAM);
    printf ("[" KGRN "OK" RESET "]\n");

    // load teams from file
    int nbTeams = load_teams_file (argv[1], teams, MAXTEAM);
    debug (KNRM, "  ... %d teams have been loaded...\n", nbTeams);

    // connect to server
    connect(teams[0].sock, (struct sockaddr *)&rem_addr, sizeof(rem_addr));

    // catch SIGINT to stop game
    if (signal (SIGINT, intHandler) == SIG_ERR) {
        fprintf (stderr, "Couldn't catch SIGINT.\n");
        exit (EXIT_FAILURE);
    }

    // start the contest
    while (running) {

        // print all teams
        printf ("   +--------------------------------------------+\n");
        printf ("   |" KRED " TEAMS " RESET "                                     |\n");
        printf ("   +--------------------------------------------+\n");
        for (i=0; i<nbTeams; i++)
            if (teams[i].robotType != RBT_MISS)
                printf ("   | %2d: %s%-" STR(MAXNAMESIZE) "s " RESET " (%3s) |\n", 
                        i,
                        COL(i),
                        teams[i].name,
                        teams[i].robotType == RBT_EV3 ? "EV3" : "NXT");
        printf ("   +--------------------------------------------+\n");

        // prompt for game composition
        printf ("Which teams are going to participate? (^D to end the contest)\n");

        char invalidInput;
        int rankCmp;

        do {
            for (i=0; i<nbTeams; i++) {
                teams[i].active = 0;
                teams[i].rank = 0;
                if (teams[i].robotType == RBT_NXT) {
                    teams[i].mailbox->messagesReady = 0;
                    teams[i].mailbox->nextMessage = 0;
                }
            }

            invalidInput = 0;

            printf ("> ");
            fflush (stdout);
            char *p = fgets (buf, MAXTEAM * 3 + 2, stdin);

            if (p == NULL)
                running = 0;
            else {
                rankCmp = 0;
                // get participating teams
                for (i=-1; *p && *p != '\n'; p++) {
                    if (*p == ' ') {
                        if (i != -1) {
                            if (i < nbTeams && teams[i].robotType != RBT_MISS && !teams[i].active) {
                                teams[i].active = 1;
                                teams[i].rank = rankCmp++;
                            } else {
                                invalidInput = 1;
                                printf ("Invalid team number: %d\n", i);
                            }
                            i = -1;
                        }
                    } else {
                        if (*p < '0' || *p > '9') {
                            invalidInput = 1;
                            printf ("Invalid input number: '%c'\n", *p);
                            break;
                        }

                        if (i == -1)
                            i = *p - '0';
                        else
                            i = i*10 + *p - '0';
                    }
                }

                if (i != -1) {
                    if (i < nbTeams && teams[i].robotType != RBT_MISS && !teams[i].active) {
                        teams[i].active = 1;
                        teams[i].rank = rankCmp++;
                    } else {
                        invalidInput = 1;
                        printf ("Invalid team number: %d\n", i);
                    }
                }

                if (rankCmp == 0)
                    invalidInput = 1;
            }
        } while (invalidInput);

        if (running) {
            int rep = 0;
            while (rep != '0') {
                printf ("Rank is:\n");
                int j;
                for (i=0; i<rankCmp; i++)
                    for (j=0; j<nbTeams; j++)
                        if (teams[j].active && teams[j].rank == i) {
                            printf ("%d: %s%s" RESET "\n", i, COL(j), teams[j].name);
                            break;
                        }
                printf ("What do you want to do?   (default: 0)\n");
                printf ("      0: keep that\n");
                printf ("      1: randomize all\n");
                printf ("      2: randomize all but leader\n");
                printf ("> ");
                fflush (stdout);
                char *p = fgets (buf, 2, stdin);
                if (p == NULL || buf[0] == '\n')
                    break;
                if (p[0] < '0' || p[0] > '2')
                    continue;

                rep = p[0];

                if (rep == '1') {
                    for (i=0; i<nbTeams; i++)
                        if (teams[i].active) {
                            char found;
                            unsigned char rnd;
                            do {
                                rnd = (unsigned char) (rand () % rankCmp);
                                found = 0;
                                for (j=0; j<i; j++)
                                    if (teams[j].active && teams[j].rank == rnd) {
                                        found = 1;
                                        break;
                                    }
                            } while (found);

                            teams[i].rank = rnd;
                        }
                } else if (rep == '2') {
                    for (i=0; i<nbTeams; i++)
                        if (teams[i].active && teams[i].rank != 0) {
                            char found;
                            unsigned char rnd;
                            do {
                                rnd = (unsigned char) (rand () % (rankCmp-1)) + 1;
                                found = 0;
                                for (j=0; j<i; j++)
                                    if (teams[j].active && teams[j].rank == rnd) {
                                        found = 1;
                                        break;
                                    }
                            } while (found);

                            teams[i].rank = rnd;
                        }
                }
            }

            debug (KRED, "Starting game with teams ");
            int j;
            for (i=0; i<rankCmp; i++)
                for (j=0; j<nbTeams; j++)
                    if (teams[j].active && teams[j].rank == i) {
                        if (i != 0)
                            debug (KRED, ", ");
                        debug (COL(j), "%s", teams[j].name);
                        break;
                    }
            debug (KRED, ".\n");
        } else
            break;

        time_t startTime = time (NULL) + CONNECT_DELAY;
        char state = GAM_CONNECTING;

        while (running) {

            fdmax = serverSock;
            FD_ZERO (&read_fd_set);
            FD_SET (serverSock, &read_fd_set);

            for (i=0; i<nbTeams; i++)
                if (teams[i].connected) {
                    FD_SET (teams[i].sock, &read_fd_set);
                    if (teams[i].sock > fdmax)
                        fdmax = teams[i].sock;
                }

            int selectRet;
            time_t now = time (NULL);

            if (now >= startTime && state == GAM_CONNECTING) {
                printf (KRED "Game starts NOW !\n" RESET);

                buf[0] = 0x00;                      // ID of start message
                buf[1] = 0x00;                      // is 0000
                buf[2] = 0xFF;                      // server ID is 0xFF
                buf[4] = MSG_START;                 // This is a START message
                buf[6] = (char) (0xFF & rankCmp);   // length of the snake

                char first = 1;
                for (i=0; i<nbTeams; i++) {
                    if (teams[i].active) {
                        if (teams[i].connected) {
                            buf[3] = (char) (0xFF & i);             // receiver
                            buf[5] = teams[i].rank;                 // rank
                            buf[7] = 0xFF;
                            buf[8] = 0xFF;
                            int j;
                            for (j=0; j<nbTeams; j++)
                                if (teams[j].active) {
                                    if (teams[j].rank == teams[i].rank - 1)
                                        buf[7] = (char) (0xFF & j); // previous
                                    if (teams[j].rank == teams[i].rank + 1)
                                        buf[8] = (char) (0xFF & j); // next
                                }

                            write_to_client (&teams[i], buf, 9);
                        } else {
                            if (first)
                                first = 0;
                            else
                                printf (KRED ", " RESET);
                            printf ("%s%s" RESET, COL(i), teams[i].name);
                        }
                    }
                }

                if (!first)
                    printf (KRED " failed to connect.\n" RESET);

                state = GAM_RUNNING;
            }
            
            if (now < startTime) {
                struct timeval tv;
                tv.tv_sec = startTime - now;
                tv.tv_usec = 0;
                selectRet = select (fdmax+1, &read_fd_set, NULL, NULL, &tv);
            } else
                selectRet = select (fdmax+1, &read_fd_set, NULL, NULL, NULL);

            if (selectRet < 0) {
                if (running) {
                    fprintf (stderr, "Error when select.\n");
                    exit (EXIT_FAILURE);
                }
            } else {

                if (FD_ISSET (serverSock, &read_fd_set)) {
                    // accept one connection
                    int client = accept(serverSock, (struct sockaddr *)&rem_addr, &opt);


                    for (i=0; i<nbTeams; i++)
                        if (memcmp (&teams[i].address, &rem_addr.rc_bdaddr, sizeof (bdaddr_t)) == 0) {
                            if (teams[i].active) {
                                teams[i].sock = client;
                                teams[i].connected = 1;
                                debug (KRED, "Team ");
                                debug (COL(i), "%s", teams[i].name);
                                debug (KRED, " is now connected.\n");
                                if (state == GAM_RUNNING) {
                                    buf[0] = 0x00;                          // ID of start message
                                    buf[1] = 0x00;                          // is 0000
                                    buf[2] = 0xFF;                          // server ID is 0xFF
                                    buf[3] = (char) (0xFF & i);             // receiver
                                    buf[4] = MSG_START;                     // This is a START message
                                    buf[5] = teams[i].rank;                 // rank
                                    buf[6] = (char) (0xFF & rankCmp);       // length of the snake
                                    buf[7] = 0xFF;
                                    buf[8] = 0xFF;
                                    int j;
                                    for (j=0; j<nbTeams; j++)
                                        if (teams[j].active) {
                                            if (teams[j].rank == teams[i].rank - 1)
                                                buf[7] = (char) (0xFF & j); // previous
                                            if (teams[j].rank == teams[i].rank + 1)
                                                buf[8] = (char) (0xFF & j); // next
                                        }
                                    write_to_client (&teams[i], buf, 9);
                                }
                            } else {
                                debug (KRED, "Team ");
                                debug (COL(i), "%s", teams[i].name);
                                debug (KRED, " tried to connect while not taking part in this game!\n");
                                close (client);
                            }

                            break;
                        }

                    if (i == nbTeams) {
                        ba2str(&rem_addr.rc_bdaddr, buf );
                        debug (KRED, "Unknown connection from address %s.\n", buf);
                        close (client);
                    }
                }

                for (i = 0; i <= nbTeams; ++i)
                    if (teams[i].connected && FD_ISSET (teams[i].sock, &read_fd_set)) {
                        memset(buf, 0, sizeof(buf));
                        int nbbytes;
                        if ((nbbytes = read_from_client (&teams[i], buf, MAXMSG)) < 0) {
                            close (teams[i].sock);
                            teams[i].connected = 0;
                            debug (KRED, "Team ");
                            debug (COL(i), "%s", teams[i].name);
                            debug (KRED, " has disconnected.\n");
                        } else if (nbbytes != 0 && state == GAM_RUNNING)
                            parseMessage (teams, nbTeams, i, (unsigned char *) buf, nbbytes);
                    }
            }
        }

        printf ("\n");
        debug (KRED, "End of this game.\n\n");
        running = 1;

        buf[0] = 0x01;                      // ID of stop message
        buf[1] = 0x00;                      // is 0001
        buf[2] = 0xFF;                      // server ID is 0xFF
        buf[4] = MSG_STOP;                  // This is a STOP message


        for (i = 0; i < nbTeams; i++) {
            if (teams[i].connected) {
                buf[3] = (char) (0xFF & i);             // receiver
                write_to_client (&teams[i], buf, 5);

                close (teams[i].sock);
                teams[i].connected = 0;
            }

            if (teams[i].active)
                teams[i].active = 0;
        }
    }

    printf ("\n");
    debug (KRED, "End of the contest.\n");

    for (i=0; i<nbTeams; i++)
        if (teams[i].robotType == RBT_NXT)
            free (teams[i].mailbox);

    if (out)
        fclose (out);

    close(serverSock);
    return 0;
}