Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Elenco Telefonico Remoto - startServer.c

startServer.c

Caricato da:
Scarica il programma completo

  1. /* startServer.c */
  2.  
  3. #include "macro.h"
  4. #include "startServer.h"
  5. #include "funzioniServer.h"
  6.  
  7. void startServer(char** argv){
  8.  
  9.         printf("\033[00;33m\nAvvio server in corso...\n");fflush(stdout);
  10.  
  11.         struct sockaddr_in target;
  12.  
  13.         /* Resetto la struct target */
  14.         memset(&target, 0, sizeof(target));
  15.  
  16.         /* Stabilisco l'indirizzo IP del server (secondo argomento da linea di comando, il protocollo utilizzato e il port number (terzo argomento da linea di comando*/
  17.         if(-1 == (inet_aton(argv[1], (struct in_addr *) (&target.sin_addr))) ){
  18.                         printf("\nErrore: indirizzo IP non valido!\n");fflush(stdout);
  19.                         chiusuraServer();
  20.         }
  21.         target.sin_family = AF_INET;
  22.         target.sin_port = htons(atoi(argv[2]));
  23.        
  24.         /* Creo il socket */
  25.         int sock;
  26.         printf("\nCreazione socket in corso...");fflush(stdout);
  27.         if(-1 == (sock = socket(AF_INET, SOCK_STREAM, 0))){
  28.                 printf("\nErrore: Impossibile creare il socket!");fflush(stdout);
  29.                
  30.                 chiusuraServer();
  31.         }
  32.  
  33.         /* Effettuo il bind */
  34.         printf("\nOK\nBind in corso...");fflush(stdout);
  35.         if(-1 == (bind(sock, (struct sockaddr *) &target, sizeof(target))) ){
  36.                 printf("\nErrore: Bind fallito!");fflush(stdout);
  37.                 chiusuraServer();
  38.         }
  39.  
  40.         /* Mi metto in ascolto */
  41.         if(-1 == (listen(sock, 1))){
  42.                 printf("\nErrore: Listen fallito!");fflush(stdout);
  43.                 chiusuraServer();
  44.         }
  45.         printf("\nOK\n");fflush(stdout);
  46.  
  47.         int newSock;
  48.         int acceptedLen;
  49.         struct sockaddr_in accepted;
  50.  
  51.         /* Resetto la struct accepted */
  52.         memset(&accepted, 0, sizeof(accepted));
  53.  
  54.         while(1){
  55.  
  56.                 /* Creo un nuovo socket per la connessione del singolo client */
  57.                 printf("\nSono in attesa di una connessione...\n");fflush(stdout);
  58.                 if(-1 == (newSock = accept(sock, (struct sockaddr *) &accepted, &acceptedLen))){
  59.                         printf("\nErrore: Impossibile creare un nuovo socket!\nConnessione fallita\n");fflush(stdout);
  60.                         continue;
  61.                 }
  62.  
  63.                 /* Primo contatto con il client, invio un OK per continuare l'invio dei dati */
  64.                 /* In caso di connessioni simultanee, il client è bloccato fino a quando tutta la coda non viene servita */
  65.  
  66.                 while(write(newSock, "OK", strlen("OK")) <= 0){
  67.                         if(errno != EINTR){
  68.                                 if(errno == ECONNRESET || errno == EPIPE){
  69.                                         printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush(stdout);
  70.                                         return;
  71.                                 }
  72.                                 else{
  73.                                         printf("La read è fallita\n");fflush(stdout);
  74.                                         perror("Errore tipo");fflush(stdout);
  75.                                         return;
  76.                                 }
  77.                         }
  78.                         printf("Errore durante la system call, ripeto\n");fflush(stdout);
  79.                 }
  80.  
  81.                 printf("\nConnessione avvenuta");fflush(stdout);
  82.                 printf("\nIn attesa del login...");fflush(stdout);
  83.  
  84.                 /* Effettuo il login del client */
  85.                 int permessi;
  86.                 permessi = login(newSock);
  87.  
  88.                 if(permessi != -1){
  89.                        
  90.                         /* In caso di Login invoco la funzione che gestisce le richieste del client */
  91.                         servizio(permessi, newSock);
  92.                 }
  93.  
  94.                 /* Il client si è disconnesso */
  95.                 printf("\nConnessione terminata.\n");
  96.         }
  97. }