/**************************************************************************/ /* */ /* P2 - MI amb sockets TCP/IP - Part II */ /* Fitxer nodelumi.c que implementa la interfície aplicació-administrador */ /* d'un node de LUMI, sobre la capa d'aplicació de LUMI (fent crides a la */ /* interfície de la capa LUMI -fitxers lumi.c i lumi.h-). */ /* */ /* Autors: Marc Cané Salamià, Enric Rodríguez Galán */ /* */ /**************************************************************************/ /* Inclusió de llibreries, p.e. #include o #include "meu.h" */ /* Incloem "MIp2-lumi.h" per poder fer crides a la interfície de LUMI */ #include "MIp2-lumi.h" #include #include #include #include #include #include #include /* Definició de constants, p.e., #define MAX_LINIA 150 */ struct usuari{ char nom[MAX_USER_NICK]; char IP[IP_LENGTH]; int UDP_port; }; int ObrirFitxLectura(const char *NomFitx) { int filedesc = open(NomFitx, O_RDONLY); if (filedesc < 0){ LUMI_MostraError("Error al obrir el fitxer de configuracio"); return -1; } return filedesc; } //Pre: buff apunta a un buffer del màxim de caràcters que pot tenir una línia //Post: retorna 1 si no s'ha arribat a la marca de fi de fitxer, 0 altrament int LlegirLinia(int fitxer, char * buff){ char c=0; int byte_llegit=1, i=0; while(byte_llegit!=0 && c!='\n'){ byte_llegit=read(fitxer,&c,1); buff[i]=c; i++; } buff[i-1]='\0'; return byte_llegit; } char DOMINI[MAX_LEN_DOMINI]; void InicialitzarTaulaUsuaris(struct usuari ** taula_usuaris, int n){ *taula_usuaris = (struct usuari *) malloc(sizeof(struct usuari)*n); } int CercarUsuariPerNom(struct usuari * taula_usuaris, const char * NomUsuari, int n_usuaris){ /*int trobat = 0, mig, esq=0 , dret = n_usuaris-1 , comparacio; while(trobat == 0 && esq<=dret){ mig = (dret + esq) / 2; comparacio = strcmp(taula_usuaris[mig].nom, NomUsuari); if (comparacio == 0) trobat = 1; else{ if (comparacio < 0) esq=mig+1; else dret=mig-1; } } if (trobat == 1) return mig; else return (-1)*mig;*/ int i=0, trobat=0; while(i 0) { //LUMI_MostraError("Error: l'usuari %s ja esta donat d'alta", NomUsuari); return -1; } else{ /*int i; posicio*=-1; for(i = n_usuaris-1; i>posicio; i--) intercanviar(taula_usuaris,i,i-1); //potser aixo peta*/ posicio = n_usuaris; strcpy(taula_usuaris[posicio].nom, NomUsuari); taula_usuaris[posicio].UDP_port=-1; } return 1; } int LlegirTaulaDesdeFitxer(const char * file_name, struct usuari ** taula_usuaris){ int fitxer = ObrirFitxLectura(file_name); if (fitxer == -1) return -1; char buff[100]; int byte_llegit, total_usuaris=0, alta_usuaris=0; LlegirLinia(fitxer,buff); //llegim el nom del domini strcpy(DOMINI,buff); LlegirLinia(fitxer,buff); //llegim el nombre d'usuaris del domini total_usuaris=atoi(buff); InicialitzarTaulaUsuaris(taula_usuaris, total_usuaris); byte_llegit = LlegirLinia(fitxer,buff); //legir primer usuari //printf("%i", (*taula_usuaris)[0].UDP_port); while(byte_llegit!=0 && alta_usuaris= 0){ strcpy(IPrem,taula_usuaris[user].IP); portUDPrem = taula_usuaris[user].UDP_port; LUMI_EnviaLiniaA(Sck, IPrem, portUDPrem, buffer); //sense retransmissions } else { LUMI_MostraError("Problema al reenviar una peticio: L'usuari no existeix"); } } else{ if (ResolDNSaIP(domini_usuari, IPrem) < 0) LUMI_MostraError("Error al resoldre direccio dns"); else { LUMI_EnviaLiniaA(Sck, IPrem, UDP_PORT, buffer); //sense retransmissions } } break; default: //Error en el format break; } } canal = HaArribatAlgunaCosaEnTemps(llistaSck, 1, 0); bytes_rebuts = LUMI_RepLiniaDe(Sck,IPrem,&portUDPrem, buffer, sizeof(buffer)); //encarregat d'enviar el AI si el format es erroni } close(Sck); return 0; }