Bonjour, je développe une toute petite application qui doit pouvoir mettre en avant les différences de performances entre send, sendto, sendfile etc...
J'ai deux processus (fichier .C) qui tournent sur la même machine. Le premier communique avec le second au travers d'un socket UDP AF_INET (j'ai pas mis AF_UNIX car après je ferai des tests sur des machines différentes). La transmission utilise bel et bien la loopback adresse mais si j'envoie des volumes important de donnée comme par exemple 10'000'000 de trames de 4096 KB, a la réception je perds environ 0.5 % des trames... Comment est-ce possible ? ou peut se situer la perte ?
Ci-dessous la manière très basique dont j'envoie et je réception les données pour une méthode d'envoi donnée.
Envoi avec sendfile
Envoi avec sendtoCode:
1
2
3
4 if(sendfile(sfd_inet_data,shm,NULL, size) == -1){ printf("Thread_%lu - Error sendfile[shm->sockBuff] - %s - ERRNO %i\n", pthread_self(), strerror(errno), errno); exit(EXIT_FAILURE); }
Réception toujours la mêmeCode:
1
2
3
4
5 memcpy(&snd_buf,curr_addr,sizeof(snd_buf)); if(sendto(sfd_inet_data,snd_buf,msg_len,0,(struct sockaddr*)&rd_data_addr, sizeof(struct sockaddr_in)) != msg_len){ printf("Thread_%lu - Error sendto[] - %s - ERRNO %i\n", pthread_self(), strerror(errno), errno); exit(EXIT_FAILURE); }
Je tiens à préciser que je ne tombe jamais dans le cas d'erreur du recvfrom.Code:
1
2
3
4
5 numBytes = recvfrom(fd, &RCV_BUFF, sizeof(RCV_BUFF), 0, NULL, NULL); if(numBytes == -1){ perror("Error during recvFrom (Printhead<--SSPD(reader) [DATAS])"); exit(EXIT_FAILURE); }
merci a l'avance pour votre aide