daemon & serveur

daemon & serveur - C - Programmation

Marsh Posté le 13-03-2008 à 20:41:08    

Bonjour, j'ai fait un programme serveur en c sous linux mais le programme s'arrete lorsque je ferme la console. Que puis je faire  pour eviter qu'il s'arrête ? Il y a t-il quelque chose à intégrer ?
Le code se présente sous cette forme (le programme marche bien):
(le serveur traite les données de chaque clients connectés)
 
static void app(void)
{
   SOCKET sock = init_connection();
   char buffer[BUF_SIZE];
   int actual = 0;
   int max = sock;
   Client clients[MAX_CLIENTS];
   fd_set rdfs;
   while(1)
   {
      int i = 0;
      FD_ZERO(&rdfs);
      FD_SET(STDIN_FILENO, &rdfs);
      FD_SET(sock, &rdfs);
      for(i = 0; i < actual; i++)
      {
         FD_SET(clients[i].sock, &rdfs);
      }
      if(select(max + 1, &rdfs, NULL, NULL, NULL) == -1)  
      {
         perror("select()" );
         exit(errno);
      }
      if(FD_ISSET(STDIN_FILENO, &rdfs))  
      {
         break;
      }
      else if(FD_ISSET(sock, &rdfs))
      {
         SOCKADDR_IN csin = { 0 };
         size_t sinsize = sizeof csin;
         int csock = accept(sock, (SOCKADDR *)&csin, &sinsize);
         if(csock == SOCKET_ERROR)
         {
            perror("accept()" );
            continue;
         }
         if(read_client(csock, buffer) == -1)
         {
            continue;
         }
         max = csock > max ? csock : max;
         FD_SET(csock, &rdfs);
         Client c = { csock };
        strncpy(c.name, buffer, BUF_SIZE - 1);
         c.name[strlen(buffer)-1]=0;
        if (accepter_client(c))
        {
           clients[actual] = c;
                       actual++;
           write_client(c.sock,"connexion accepté\n" );
                   }
       }
       else
       {
           int i = 0;
           for(i = 0; i < actual; i++)
           {
                 if(FD_ISSET(clients[i].sock, &rdfs))
                 {
                       Client client = clients[i];
                       int c = read_client(clients[i].sock, buffer);
                       if(c == 0)
                       {
    closesocket(clients[i].sock);
                            remove_client(clients, i, &actual);
                            strncpy(buffer, client.name, BUF_SIZE - 1);
                            strncat(buffer, " disconnected !", BUF_SIZE - strlen(buffer) - 1);
                       }
                       else
                       {
     traiter_client(buffer);
                        }
            break;
                 }
           }
       }
   }
   clear_clients(clients, actual);
   end_connection(sock);
}

Reply

Marsh Posté le 13-03-2008 à 20:41:08   

Reply

Marsh Posté le 13-03-2008 à 21:11:44    

./monprogramme &


 


---------------
Töp of the plöp
Reply

Marsh Posté le 13-03-2008 à 21:36:29    

si c'était aussi simple. Le problème c'est que en fermant la console le processus s'en va aussi car il dépend directement de se dernier.

Reply

Marsh Posté le 13-03-2008 à 21:39:37    

Faut imuniser le process au signal SIG_HUP, en utilisant la fonction signal().

Reply

Marsh Posté le 13-03-2008 à 21:39:54    

Comment ça, ton programme dépend de la console ?


---------------
Töp of the plöp
Reply

Marsh Posté le 13-03-2008 à 21:46:58    

Ben oui, moi si je ferme la fenetre putty et que je me reconnecte je n'ai plus de processus. ps aux|grep monprogramme,  ben rien.

Reply

Marsh Posté le 13-03-2008 à 21:48:27    

Qu'est ce que c'est cette fonction signal ?
Je le met où dans le main ?

Reply

Marsh Posté le 13-03-2008 à 22:02:08    

Est ce quelqu'un pourra me dire si la solution est en utilisant fork() ?

Reply

Marsh Posté le 14-03-2008 à 11:34:43    

Reply

Marsh Posté le 14-03-2008 à 15:20:53    

man 3 daemon

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed