Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //SERVER
- #include "listaMessaggi.h"
- #include <unistd.h>
- #include <netdb.h>
- #include <string.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <fcntl.h>
- #include <signal.h>
- #define MAX_DIM 1072
- #define CODA 3
- #define ERRORE(x) {puts(x);exit(-1);}
- int connessione=0;
- int ds_sock;
- int socketclient; // socket del client dove la connessione viene accettata
- char buff[MAX_DIM];
- char buffUser[20];
- char buffPass[20];
- int username; //username dell'utente momentaneamente connesso
- int password; //password dell'utente momentaneamente connesso
- listaMessaggi *lista;
- int autenticazione(char *user, char *pass){// funzione da rivedere
- int ris=-1;
- char temp[MAX_DIM];
- FILE *fileAutentic=fopen("autenticazione", "w");//file per salvare gli utenti rgistrati
- if(fileAutentic==NULL)
- ERRORE("errore nella fopen\n");
- char *userid;
- int userID = fscanf(fileAutentic, "%s", &userid) {
- if(userID==-1)
- ERRORE("errore nella fscanf\n");
- }
- while(userID!=0){// userID!=0, quindi ha letto un user
- if(strcmp(temp,user)==0){ // vede se l'user passato è presente nel file
- char *passID;
- int password = fscanf(fileAutentic, "%s", &passID) {
- if(password==-1)
- ERRORE("errore nella fscanf\n");
- }
- if(strcmp(temp,pass)==0){ // confronta le password
- ris=0;// sono uguali, quindi l'utente già è presente; ris=0 e ha già una sua lista messaggi
- }
- }
- }
- if(ris==-1){// l'utente non c'è, si deve iscrivere
- int registraUser=fprintf(fileAutentic,"%s\n",user);
- if(registraUser<0) ERRORE("errore nella read\n");
- int registraPass=fprintf(fileAutentic,"%s\n",pass);
- if(registraPass<0) ERRORE("errore nella read\n");
- ris=1; //l'utente è si è appena registrato, non ha una sua lista messaggi, la si deve creare
- lista=nuovaListaMess();
- }
- int close=fclose(fileAutentic);
- if (close < 0) ERRORE("errore nella fclose\n");
- return ris;
- }
- void funzione(){
- int richiesta=recv (ds_sock,buff,MAX_DIM,0);
- if(richiesta==-1) ERRORE("errore nella receive\n");
- if(strcmp(buff, '1')==0) leggiMess(lista);
- if(strcmp(buff, '2')==0) salvaMessaggi(lista);
- if(strcmp(buff, '3')==0) cancellaMessaggi(lista);
- }
- void salvaMessaggi(listaMessaggi *lista){ // funzione da rivedere
- //la lista viene creata nel momento in cui un utente si autentica.
- messaggio *mess=lista->top;
- char buffDest[20];
- char buffMitt[20];
- char buffOgg[30];
- char buffTesto[1024];
- int destinatario=recv(socketclient,buffDest, sizeof(buffDest),0); // per sapere qual'è il destinatario
- if(destinatario==-1) ERRORE("errore\n");
- int mittente=recv(socketclient,buffMitt, sizeof(buffMitt),0); // il mittente
- if(mittente==-1) ERRORE("errore\n");
- int oggetto=recv(socketclient, buffOgg, sizeof(buffOgg),0); // oggetto
- if(oggetto==-1) ERRORE("errore\n");
- int testo=recv(socketclient,buffTesto, sizeof(buffTesto),0);// testo
- if(testo==-1) ERRORE("errore\n");
- if(strcmp(buffDest,mess->destinatario)==0) { //se il mess è per lui, ma non può essere lui xkè è lui che lo invia! come si fa?!?!?!?
- inserisciMessaggio(lista,buffDest,buffMitt,buffOgg,buffTesto);
- }
- else{ //il mess non è per lui, crea un altra lista con il nuovo destinatario
- listaMessaggi *lista2=nuovaListaMess();
- inserisciMessaggio(lista2,buffDest,buffMitt,buffOgg,buffTesto);
- }
- }
- void cancellaMessaggi(listaMessaggi *lista){ //funzione che cancella
- cancellaMessaggi(lista);
- }
- void leggiMess(listaMessaggi *lista ){
- char buff[MAX_DIM];
- //richiesta di lettura di messaggi da parte del client
- if(lista->top == NULL)
- buff[0]=NULL;
- send(socketclient, buff, MAX_DIM);
- else{
- while(lista->top != NULL){
- strcat( buff, lista->top->mittente );
- strcat( buff, "\n" );
- strcat( buff, lista->top->oggetto );
- strcat( buff, "\n" );
- strcat( buff, lista->top->testo );
- send(socketclient,buff,MAX_DIM);
- lista->top = lista ->top->prossimoMess;
- }
- }
- }
- int main() {
- struct sockaddr_in server;
- struct sockaddr client;
- puts("###########################");
- puts("# SCAMBIO MESSAGGI SERVER #");
- puts("###########################");
- puts("Avvio server....");
- ds_sock = socket(AF_INET, SOCK_STREAM, 0);
- if (ds_sock < 0) {
- ERRORE("errore nella creazione socket\n");
- }
- server.sin_family = AF_INET;
- server.sin_port = htons(3000);
- server.sin_addr.s_addr= INADDR_ANY;
- signal(SIGINT, gestsignterm);
- signal(SIGSTOP, gestsignterm);
- signal(SIGHUP, gestsignterm);
- signal(SIGQUIT, gestsignterm);
- signal(SIGPIPE, gestsignbp);
- int k = bind(ds_sock, &server,sizeof(server));
- if (k < 0) {
- ERRORE("errore nella bind\n");
- }
- int e = listen(ds_sock, CODA);
- if (e < 0) {
- ERRORE("errore nella listen\n");
- }
- int length =sizeof(client);
- while(connessione=0) {
- socketclient=accept(ds_sock, &client, length);
- if (socketclient < 0) {
- ERRORE("errore nella accept\n");
- }
- connessione=1;
- }
- //prima deve partire l'autenticazione e ricevere user e pass
- userArrivato=recv(socketclient, buffUser, sizeof(buffUser),0); // controllo degli errori
- passArrivata=recv(socketclient, buffPass, sizeof(buffPass),0);
- strcpy(username, buffUser[1]);
- strcpy(password, buffPass[1]);
- int ris=autenticazione(username, password);
- if(ris>0)
- funzione();
- else ERRORE("non si è autenticato\n");
- connessione=0;
- }
- //gestione dei segnali
- void gestsignterm() {
- puts("Terminazione Server...\n");
- }
- void gestsignbp() {
- puts("Connessione terminata inaspettatamente dal client...\n");
- }
Add Comment
Please, Sign In to add comment