Oppure

Loading
07/12/10 4:16
Alexi
Salve a tutti, Mi chiamo Aleksi e ho un piccolo problemi con un programma scritto in C che sostanzialmente dovrebbe creare un demone che accetta connessioni su una determinata porta e quindi fa gestire la connessione a un processo figlio.

Quando il figlio è terminato però, vorrei che il padre lo chiudesse ma senza che smetta di accettare connessioni... Eccovi il codice:
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>

FILE *fd;



int main(void)
{
    pid_t demone, sid;
    fd=fopen("game.log","a");
    /*Controllo file di configurazione*/
    /*...*/
    /* Creazione Demone*/
    demone = fork();
    if(demone==0) {
      sid = setsid();
      if(sid < 0) {
        printf("Errore nel settaggio dell'id di sistema");
        exit(-1);
      }
    }
    else if(demone < 0) {
           printf("Errore nella crezione del demone");
           exit(-1);
    }
    else {
           /* Demone creato con successo */
           printf("Demone con id %d creato\n",demone);
           exit(0);
    }

    umask(0);

    /*Chiusura files relativi al programma*/
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);


    struct sockaddr_in target;
        memset(&target, 0, sizeof(target));

        if (-1 == (inet_aton("0.0.0.0", (struct in_addr *) (&target.sin_addr))) )
        {
         fprintf(fd,"Error: invalid IP address!");fflush(fd);
         exit(1);
        }
        target.sin_family = AF_INET;
        target.sin_port = htons(4000);
        int sock;
        fprintf(fd,"Creazione del socket sull'ip 0.0.0.0 alla porta 4000\n");fflush(fd);
        if (-1 == (sock = socket(AF_INET, SOCK_STREAM, 0)))
        {
         fprintf(fd,"Errore: Impossibile Creare il Socket!\n");fflush(fd);
         exit(1);
        }
        //fprintf(fd,"Socket Creato. Bindaggio...\n");fflush(fd);
        if (-1 == (bind(sock, (struct sockaddr *) &target, sizeof(target))))
        {
         fprintf(fd,"Errore: Impossibile Bindare il Socket!\n");fflush(fd);
         exit(1);
        }
        //fprintf(fd,"Eseguito\n");fflush(fd);
        //fprintf(fd,"Attendendo nuove connessioni\n");fflush(fd);
        if (-1 == (listen(sock, 1)))
        {
         fprintf(fd,"Errore: Impossibile Settare Socket in Ascolto!!\n");fflush(fd);
         exit(1);
        }
        while(1)
        {
          int newSock, acceptedLen,pid;
          struct sockaddr_in accepted;
          if (-1 == (newSock = accept(sock, (struct sockaddr *) &accepted, &acceptedLen)))
          {
            fprintf(fd,"Errore: Impossibile accettare la nuova connessione!!\n");fflush(fd);
            close(newSock);
            exit(1);
          }
          if ((pid=fork()) <0) {
            fprintf(fd,"Errore nella fork\n");fflush(fd);
            exit(-1);
          }
          if(pid==0) {
            sonsid=setsid();
            if(sonsid<0) {
              fprintf(fd,"Errore: Impossibile assegnare un'id di sistema al figlio");fflush(fd);
              exit(-1);
            }
            int lng = 0,i,f,j;
            #define SIZE 50
            char buffer[SIZE];
            read(newSock, buffer, SIZE);
            fprintf(fd,"Bytes ricevuti: %s \n",buffer);fflush(fd);
            exit(0);
          }

          close(newSock);
        }
        fclose(fd);
      return 0;
}


Sapete dirmi se c'è un modo migliore per gestire le connessioni o come posso risolvere il mio problema utilizzando questo sistema? Grazie
aaa
07/12/10 8:43
Numa Pompilio
Postato originariamente da Alexi:

Salve a tutti, Mi chiamo Aleksi e ho un piccolo problemi con un programma scritto in C che sostanzialmente dovrebbe creare un demone che accetta connessioni su una determinata porta e quindi fa gestire la connessione a un processo figlio.

Quando il figlio è terminato però, vorrei che il padre lo chiudesse ma senza che smetta di accettare connessioni... Eccovi il codice:
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>

FILE *fd;



int main(void)
{
    pid_t demone, sid;
    fd=fopen("game.log","a");
    /*Controllo file di configurazione*/
    /*...*/
    /* Creazione Demone*/
    demone = fork();
    if(demone==0) {
      sid = setsid();
      if(sid < 0) {
        printf("Errore nel settaggio dell'id di sistema");
        exit(-1);
      }
    }
    else if(demone < 0) {
           printf("Errore nella crezione del demone");
           exit(-1);
    }
    else {
           /* Demone creato con successo */
           printf("Demone con id %d creato\n",demone);
           exit(0);
    }

    umask(0);

    /*Chiusura files relativi al programma*/
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);


    struct sockaddr_in target;
        memset(&target, 0, sizeof(target));

        if (-1 == (inet_aton("0.0.0.0", (struct in_addr *) (&target.sin_addr))) )
        {
         fprintf(fd,"Error: invalid IP address!");fflush(fd);
         exit(1);
        }
        target.sin_family = AF_INET;
        target.sin_port = htons(4000);
        int sock;
        fprintf(fd,"Creazione del socket sull'ip 0.0.0.0 alla porta 4000\n");fflush(fd);
        if (-1 == (sock = socket(AF_INET, SOCK_STREAM, 0)))
        {
         fprintf(fd,"Errore: Impossibile Creare il Socket!\n");fflush(fd);
         exit(1);
        }
        //fprintf(fd,"Socket Creato. Bindaggio...\n");fflush(fd);
        if (-1 == (bind(sock, (struct sockaddr *) &target, sizeof(target))))
        {
         fprintf(fd,"Errore: Impossibile Bindare il Socket!\n");fflush(fd);
         exit(1);
        }
        //fprintf(fd,"Eseguito\n");fflush(fd);
        //fprintf(fd,"Attendendo nuove connessioni\n");fflush(fd);
        if (-1 == (listen(sock, 1)))
        {
         fprintf(fd,"Errore: Impossibile Settare Socket in Ascolto!!\n");fflush(fd);
         exit(1);
        }
        while(1)
        {
          int newSock, acceptedLen,pid;
          struct sockaddr_in accepted;
          if (-1 == (newSock = accept(sock, (struct sockaddr *) &accepted, &acceptedLen)))
          {
            fprintf(fd,"Errore: Impossibile accettare la nuova connessione!!\n");fflush(fd);
            close(newSock);
            exit(1);
          }
          if ((pid=fork()) <0) {
            fprintf(fd,"Errore nella fork\n");fflush(fd);
            exit(-1);
          }
          if(pid==0) {
            sonsid=setsid();
            if(sonsid<0) {
              fprintf(fd,"Errore: Impossibile assegnare un'id di sistema al figlio");fflush(fd);
              exit(-1);
            }
            int lng = 0,i,f,j;
            #define SIZE 50
            char buffer[SIZE];
            read(newSock, buffer, SIZE);
            fprintf(fd,"Bytes ricevuti: %s \n",buffer);fflush(fd);
            exit(0);
          }

          close(newSock);
        }
        fclose(fd);
      return 0;
}


Sapete dirmi se c'è un modo migliore per gestire le connessioni o come posso risolvere il mio problema utilizzando questo sistema? Grazie


Dovresti gestire il padre con l'if(pid>0)
aaa
07/12/10 20:39
lumo
Postato originariamente da Alexi:

Salve a tutti, Mi chiamo Aleksi e ho un piccolo problemi con un programma scritto in C che sostanzialmente dovrebbe creare un demone che accetta connessioni su una determinata porta e quindi fa gestire la connessione a un processo figlio.

Quando il figlio è terminato però, vorrei che il padre lo chiudesse ma senza che smetta di accettare connessioni... Eccovi il codice:
...

Sapete dirmi se c'è un modo migliore per gestire le connessioni o come posso risolvere il mio problema utilizzando questo sistema? Grazie


non è che hai le idee un po' confuse? il padre è già stato terminato, il codice sotto è quello del figlio, che in questo caso è un demone.
Se vuoi che continui ad accettare connessioni non basta togliere l'exit(0); dal while?
Postato originariamente da Numa Pompilio:
Dovresti gestire il padre con l'if(pid>0)

della serie consigli inutili :rotfl: usate la testa ragazzi, i codici non devono essere tutti identici
Ultima modifica effettuata da lumo 07/12/10 20:43
aaa
07/12/10 20:43
Alexi
si beh ma il padre crea un figlio, e quando il figlio riceve una connessione si crea un "nipote" che la gestisce... questa era la mia idea... solo non posso mettere in wait il figlio, quando ci saranno altre connessioni in arrivo...
aaa
07/12/10 21:20
Numa Pompilio
Postato originariamente da lumo:
della serie consigli inutili :rotfl: usate la testa ragazzi, i codici non devono essere tutti identici


Questa non l'ho capita....
aaa
07/12/10 21:23
Numa Pompilio
Postato originariamente da Numa Pompilio:

Postato originariamente da lumo:
della serie consigli inutili :rotfl: usate la testa ragazzi, i codici non devono essere tutti identici


Questa non l'ho capita....

p.s. Meno presunzione...meno presunzione. Ne avete ancora da imparare
aaa