int nombreElements(llist liste) { /* Si la liste est vide, il y a 0 élément */ if(liste == NULL) return 0; /* Sinon, il y a un élément (celui que l'on est en train de traiter) plus le nombre d'éléments contenus dans le reste de la liste */ return nombreElements(liste->nxt)+1; }
void* thread_reception_data(void* data) { //se mettre en ecoute sur 0.0.0.0 struct sockaddr_in sin; int sock = socket(AF_INET, SOCK_DGRAM, 0), sock_envoie; int tmp, taille, ip; short port; LargePaquet paquet; if(sock == SOCKET_ERROR) { printf("[-] Erreur socket\n"); return NULL; } sin.sin_addr.s_addr = inet_addr("0.0.0.0"); sin.sin_family = AF_INET; sin.sin_port = htons(PORT_UDP); tmp = bind(sock, (struct sockaddr*)&sin, sizeof(sin)); //On associe l'adresse au socket if(tmp == SOCKET_ERROR) { perror("[-] bind"); return; } //On ecoute en permanence while(1) { taille = sizeof(sin); tmp = recvfrom(sock, (char*) &paquet, sizeof(Paquet), 0, (struct sockaddr*)&sin, &taille); if(tmp == SOCKET_ERROR) { perror("[-] recvfrom"); continue; } ip = htonl(sin.sin_addr.s_addr); port = paquet.paquet.port_usage; //On check l'action et on fait une action switch(paquet.paquet.action) { case ASK_CONNECTION: printf("[i] reception ASK_CONNECTION\n"); traitement_ASK_CONNECTION(ip, port); break; case ANS_CONNECTION_NO: printf("[i] reception ANS_CONNECTION_NO\n"); traitement_ANS_CONNECTION_NO(ip); break; case ANS_CONNECTION_YES: printf("[i] reception ANS_CONNECTION_YES\n"); traitement_ANS_CONNECTION_YES(ip, port); break; case VAL_CONNECTION: printf("[i] reception VAL_CONNECTION\n"); traitement_VAL_CONNECTION(ip); break; case KEEP_CONTACTE: printf("[i] reception KEEP_CONTACTE\n"); traitement_KEEP_CONTACTE(ip); break; case ASK_MAJ: printf("[i] reception ASK_MAJ\n"); traitement_ASK_MAJ(ip, port); break; case ANS_MAJ_NO: printf("[i] reception ANS_MAJ_NO\n"); traitement_ANS_MAJ_NO(); break; case ANS_MAJ_YES: printf("[i] reception ANS_MAJ_YES\n"); traitement_ANS_MAJ_YES(ip, port); break; case GIVE_CONTACTE: printf("[i] reception GIVE_CONTACTE\n"); traitement_GIVE_CONTACTE(paquet); break; } printf("[i] Serveur: %d\tClient: %d\n", nombreElements(liste_serveur), nombreElements(liste_client)); //verifie la version if(paquet.paquet.version > VERSION) { printf("[+] La version %d semble etre disponible\n", paquet.paquet.version); demander_maj(ip, port); } } return NULL; }