Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Réseau
Réseau Forum d'entraide sur la programmation réseau en C
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 03/10/2012, 13h47   #1
cyrill.gremaud
Membre éprouvé
 
Homme Cyrill Gremaud
Ingénieur systèmes et réseaux
Inscription : août 2005
Messages : 1 031
Détails du profil
Informations personnelles :
Nom : Homme Cyrill Gremaud
Âge : 24
Localisation : Suisse

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Enseignement

Informations forums :
Inscription : août 2005
Messages : 1 031
Points : 459
Points : 459
Par défaut socket UDP inter processus

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
Code :
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);
}
Envoi avec sendto
Code :
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);
}
Réception toujours la même
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);
}
Je tiens à préciser que je ne tombe jamais dans le cas d'erreur du recvfrom.

merci a l'avance pour votre aide
__________________
Il y a 10 types de personnes sur la planète. Ceux qui comprennent le binaire et ceux qui ne le comprennent pas...
cyrill.gremaud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2012, 11h55   #2
autre mickael
Nouveau Membre du Club
 
Inscription : octobre 2010
Messages : 56
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 56
Points : 38
Points : 38
Salut,

Par définition, UDP ne garantie pas l'acheminement des données, il faut utiliser TCP si tu veux que les messages arrivent. L'erreur est peut-être dans un buffer qui "déborde" : comme l’émetteur n'attend pas d'accusé de réception, il envoie toutes les trames alors que le destinataire n'a pas eu le temps de les lire.
autre mickael est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 10h14.


 
 
 
 
Partenaires

Hébergement Web