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:
Sapete dirmi se c'è un modo migliore per gestire le connessioni o come posso risolvere il mio problema utilizzando questo sistema? Grazie
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