Membership::Membership(bool introducer, int port) { logFile.open("logMembership.log"); isIntroducer = introducer; this->port = port; leader.active = false; sockfd = bindSocket(port); if(isIntroducer){ logFile << "I am the introducer! " << std::endl; getAdress("Address.add"); } else{ getAdress("AddrIntro.add"); } roundLock.lock(); roundId = 0; roundLock.unlock(); join(); std::thread th3(&Membership::forJoinThread, this); std::thread th1(&Membership::listeningThread, this); std::thread th2(&Membership::detectThread, this); listening.swap(th1); detecting.swap(th2); joinThread.swap(th3); killListeningThread = false; killDetectingThread = false; //runLeaderElection(); }
int main(int argc, char **argv) { int link = 1, i; /* directorul de la cere se pleaca initial */ char *directory = (char *)malloc(MAXLEN* sizeof(char)); char *filePath = (char *)malloc(MAXLEN * sizeof(char)); char *linkPrimit = (char *)malloc(MAXLEN * sizeof(char)); char *linkScriere = (char *)malloc(MAXLEN * sizeof(char)); char * addres = (char *)malloc(MAXLEN * sizeof(char)); char * fileLog = (char *)malloc(MAXLEN * sizeof(char)); char *argL = (char *)malloc(MAXLEN * sizeof(char)); memset(fileLog,0,MAXLEN); memset(directory,0,MAXLEN); memset(filePath,0,MAXLEN); memset(addres,0,MAXLEN); memset(linkPrimit,0,MAXLEN); memset(linkScriere,0,MAXLEN); memset(argL,0,MAXLEN); /* se concateneaza totate argumentele din linia de comanda */ for (i = 1; i< argc ;i ++) strcat(argL,argv[i]); /* verificare ce argumente sunt active */ if(strstr(argL,"-r") > 0){ activR = 1; } if(strstr(argL,"-e") > 0){ activE = 1; } if(strstr(argL,"-o") > 0){ activO = 1; } /* nu sunt argumente in linia de comanda */ if(argc == 2){ link = 1; } /* un singur argument */ if(argc == 3){ link = 2; } /* 2 argumente */ if(argc == 4){ link = 3; if(activO == 1) sprintf(fileLog,"%s",argv[2]); } /* toate argumentele */ if(argc == 6){ link = 5; sprintf(fileLog,"%s",argv[4]); } if(activO == 1) fExit = fopen(fileLog,"w"); if(argc == 5){ if(activO == 1){ fprintf(fExit, "Eroare numar de argumente incorecte\n"); exit(-1); } else{ fprintf(stderr, "Eroare numar de argumente incorecte\n"); exit(-1); } } /* trimit o singura data cand nu am argumente in linia de comanda*/ getFileAddress(argv[link],linkPrimit,filePath,directory); sprintf(linkScriere,"%s%s",directory,filePath); /* se creaza directorul de start din link-ul primit ca parametru */ getAdress(linkPrimit,addres); mkdir(addres,S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); mkdir(directory,S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); /* se apeleaza functia pentru a descarca paginile cerute */ linkPages(argv[link],linkPrimit,linkScriere,directory,1,0); if(activO == 1) fclose(fExit); free(directory); free(linkPrimit); free(linkScriere); free(filePath); free(addres); free(argL); free(fileLog); }
/* functia parcurge paginile, apeleaza recursiv si descarca in functie de parametri dati in linia de comanda */ void linkPages(char * original, char * argument,char * filePath, char * directory,int rec, int s){ /* conditia de oprire */ if (rec > 5) return; int sockfd; int port = SMTP_PORT; int rezult, i = 0, len = 0; struct sockaddr_in servaddr; struct hostent * host; /* declarare constante */ char server_ip[10]; char sendbuf[MAXLEN]; char recvbuf[MAXLEN]; char * addres = (char *)malloc(MAXLEN * sizeof(char)); char * ipAd = (char *)malloc(MAXLEN * sizeof(char)); char *fileApel = (char *)malloc(MAXLEN * sizeof(char)); char *linkPrimit = (char *)malloc(MAXLEN * sizeof(char)); char *fileNext = (char *)malloc(MAXLEN * sizeof(char)); char *m = (char *)malloc(MAXLEN * sizeof(char)); char *p = (char *)malloc(MAXLEN * sizeof(char)); char *getCom = (char *)malloc(MAXLEN * sizeof(char)); char **d = (char **)malloc(MAXLEN * sizeof(char)); /* setare pe 0 pentru a evita erorile */ memset(getCom,0,MAXLEN); memset(p,0,MAXLEN); memset(addres,0,MAXLEN); memset(ipAd,0,MAXLEN); memset(fileApel,0,MAXLEN); memset(fileNext,0,MAXLEN); memset(linkPrimit,0,MAXLEN); memset(m,0,MAXLEN); /* calculare adresa primita ca parametru */ getAdress(argument,addres); host = gethostbyname(addres); /* calculare adresa IP */ sprintf(ipAd,"%s",inet_ntoa(*(struct in_addr*)host->h_addr_list[0])); strcpy(server_ip, ipAd); if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){ if(activO == 1){ fprintf(fExit,"Eroare la creare socket.\n"); } else fprintf(stderr,"Eroare la creare socket.\n"); exit(-1); } /* formarea adresei serverului */ memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(port); if (inet_aton(server_ip, &servaddr.sin_addr) <= 0 ) { if(activO == 1){ fprintf(fExit, "Adresa IP invalida.\n"); } else{ fprintf(stderr, "Adresa IP invalida.\n"); } exit(-1); } /* conectare la server */ if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0 ) { if(activO == 1){ fprintf(fExit, "Eroare la conectare\n"); } else{ fprintf(stderr, "Eroare la conectare\n"); } exit(-1); } /* trimitere comanda la server */ sprintf(getCom,"GET %s HTTP/1.0 \n\n",original); FILE * f = fopen(filePath,"wb"); send_command(sockfd,getCom); i = 0; /* se elimina antetul din pagina primita */ while((len = Readline(sockfd,recvbuf,MAXLEN-1)) > 0){ i++; if(len <= 2) break; memset(recvbuf, 0, MAXLEN); } /* daca a fost trimis link de descarcare */ if (s == 1){ while((len = recv(sockfd, recvbuf, MAXLEN, 0)) > 0) { fwrite(recvbuf, sizeof(char), len, f); memset(recvbuf, 0, MAXLEN); } } /* altfel se verifica paginile .html si de scriu in fisier */ else{ while(Readline(sockfd, recvbuf, MAXLEN) > 0){ /* verifica daca linia curecta contine */ if(vefiricaLink(recvbuf) == 1){ extractLink(recvbuf,p); if(strcmp(p,"") != 0){ sprintf(m,"%s%s",argument,p); memset(directory,0,MAXLEN); d = getFileAddress(m,linkPrimit,fileNext,directory); sprintf(fileApel,"%s%s",directory,fileNext); /* numai pentru recursivitate */ if (activR == 1 && strstr(p,".html") > 0){ i = 0; /* creeaza ierarhia de directoare */ while(d[i] != NULL){ mkdir(d[i],S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); i ++; } /* verifica daca fisierul exista */ rezult = access(fileApel,F_OK); /* daca nu exista se apeleaza recursiv pentru link-urile gasite */ if(rezult != 0 && rec <= 5 ) linkPages(m,linkPrimit,fileApel,directory,rec + 1,0); } /* daca este activ -e se apeleaza recursiv pentru a se descarca */ if(activE == 1 && strstr(p,".html") <= 0){ i = 0; /* creeaza ierarhia de directoare */ while(d[i] != NULL){ mkdir(d[i],S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); i ++; } /* verifica daca fisierul exista */ rezult = access(fileApel,F_OK); /* se apeleaza recursiv cu s = 1 pentru a intra pe coditia pentru descarcare */ if(rezult != 0 ){ linkPages(m,linkPrimit,fileApel,directory,1,1); } } } } /* scrie paginile in fisier */ for(i = 0; i < strlen(recvbuf) ;i ++) fwrite(&recvbuf[i],sizeof(char),1,f); } } free(addres); free(ipAd); free(getCom); free(m); free(linkPrimit); free(fileApel); free(p); free(fileNext); fclose(f); close(sockfd); }