+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    août 2005
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Suisse

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

    Informations forums :
    Inscription : août 2005
    Messages : 1 058
    Points : 448
    Points
    448

    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...

  2. #2
    Membre du Club
    Inscrit en
    octobre 2010
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : octobre 2010
    Messages : 56
    Points : 43
    Points
    43

    Par défaut

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •