/* startServer.c */
#include "macro.h"
#include "startServer.h"
#include "funzioniServer.h"
void startServer(char** argv){
printf("\033[00;33m\nAvvio server in corso...\n");fflush
(stdout
);
struct sockaddr_in target;
/* Resetto la struct target */
memset(&target, 0, sizeof(target));
/* 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*/
if(-1 == (inet_aton(argv[1], (struct in_addr *) (&target.sin_addr))) ){
printf("\nErrore: indirizzo IP non valido!\n");fflush
(stdout
);
chiusuraServer();
}
target.sin_family = AF_INET;
target.sin_port = htons(atoi(argv[2]));
/* Creo il socket */
int sock;
printf("\nCreazione socket in corso...");fflush
(stdout
);
if(-1 == (sock = socket(AF_INET, SOCK_STREAM, 0))){
printf("\nErrore: Impossibile creare il socket!");fflush
(stdout
);
chiusuraServer();
}
/* Effettuo il bind */
printf("\nOK\nBind in corso...");fflush
(stdout
);
if(-1 == (bind(sock, (struct sockaddr *) &target, sizeof(target))) ){
printf("\nErrore: Bind fallito!");fflush
(stdout
);
chiusuraServer();
}
/* Mi metto in ascolto */
if(-1 == (listen(sock, 1))){
printf("\nErrore: Listen fallito!");fflush
(stdout
);
chiusuraServer();
}
printf("\nOK\n");fflush
(stdout
);
int newSock;
int acceptedLen;
struct sockaddr_in accepted;
/* Resetto la struct accepted */
memset(&accepted, 0, sizeof(accepted));
while(1){
/* Creo un nuovo socket per la connessione del singolo client */
printf("\nSono in attesa di una connessione...\n");fflush
(stdout
);
if(-1 == (newSock = accept(sock, (struct sockaddr *) &accepted, &acceptedLen))){
printf("\nErrore: Impossibile creare un nuovo socket!\nConnessione fallita\n");fflush
(stdout
);
continue;
}
/* Primo contatto con il client, invio un OK per continuare l'invio dei dati */
/* In caso di connessioni simultanee, il client è bloccato fino a quando tutta la coda non viene servita */
while(write(newSock, "OK", strlen("OK")) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
return;
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
return;
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
printf("\nConnessione avvenuta");fflush
(stdout
);
printf("\nIn attesa del login...");fflush
(stdout
);
/* Effettuo il login del client */
int permessi;
permessi = login(newSock);
if(permessi != -1){
/* In caso di Login invoco la funzione che gestisce le richieste del client */
servizio(permessi, newSock);
}
/* Il client si è disconnesso */
printf("\nConnessione terminata.\n");
}
}