IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Problèmes de lecture/écriture sur deux sockets


Sujet :

Linux

  1. #1
    Membre régulier
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    81
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 81
    Points : 77
    Points
    77
    Par défaut Problèmes de lecture/écriture sur deux sockets
    Bonjour,
    Je cherches à développer un proxy udp. Pour cela j'utilises une classe HalfProxy qui s'occupe de récupérer le flux sur une interface puis de l'envoyer vers l'autre.
    HalfProxy est crée avec en paramètre deux identifiants de socket déjà bindés (l'une sur l'interface locale sur le port server et l'autre sur l'interface publique sur le port client)
    A terme le proxy sera composé de deux HalfProxy chacun écoutant sa socket et, lors de la réception d'un message, renvoyant le message à travers la deuxième socket (donc dans le cas ou un message arrive sur l'interface lan, le message sera envoyé par la socket réalisant l'écoute wan).

    J'ai quelques petits soucis avec mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    ...
    void HalfProxy::listen()
    {
        char lBuffer[BUFFER_SZ];
     
        struct sockaddr_storage lClientAddr;
        socklen_t lClientAddrSize = sizeof(lClientAddr);
        int lSize;
        while(_running)
        {
            lSize = recvfrom(*_listenSocket, lBuffer, BUFFER_SZ, MSG_DONTWAIT , ( sockaddr *) &lClientAddr, &lClientAddrSize);
            if(lSize > -1)
            {
                char lMessage[lSize];
                memcpy(lMessage,lBuffer,lSize);
     
                assert(sendMessage(lMessage, lSize));
     
                memset(lMessage,'\0',lSize);
                memset(lBuffer,'\0',BUFFER_SZ);
            }
        }
    }
     
    bool HalfProxy::sendMessage(void* pMessage, int pSize)
    {
        socklen_t lSendAddressSize = sizeof(_sendAddress);
        int lSendSize = sendto(*_sendSocket, pMessage, pSize, 0, (sockaddr *) &_sendAddress, lSendAddressSize);
        perror("Send ");
        return lSendSize != -1 ? true : false;
    }
    ...
    Le problème est que lorsque recvfrom à le flag MSG_DONTWAIT, la fonction sendto me retourne -1 et perror() me renvoie: "Resource temporarily unavailable".
    Si je change le flag MSG_DONTWAIT pour le passer à 0, tout fonctionne à merveille.

    Je ne comprends pas pourquoi positionner le flag sur un recvfrom sur une socket me pose des problèmes pour envoyer des messages via une autre socket à destination d'une adresse externe.

    De plus j'aimerais savoir si l'utilisation que je souhaite faire de mon HalfProxy vous paraît pertinente.

    Merci à tous.

  2. #2
    Membre régulier
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    81
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 81
    Points : 77
    Points
    77
    Par défaut
    En fait même lorsque j'avais le message d'erreur les paquets étaient bien envoyés. La raison que l'on vient de me donner sur un autre forum est que la valeur de erno qui (conditionne la sortie de perror) était positionée dès la fonction recvfrom (logique puisque elle était en mode non bloquant donc retournait une erreur lorsque elle n'avait aucun message).

    Par contre si quelqu'un à des coneils à me donner pour le design de mon proxy, je suis preneur.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Popof Voir le message
    En fait même lorsque j'avais le message d'erreur les paquets étaient bien envoyés. La raison que l'on vient de me donner sur un autre forum est que la valeur de erno qui (conditionne la sortie de perror) était positionée dès la fonction recvfrom (logique puisque elle était en mode non bloquant donc retournait une erreur lorsque elle n'avait aucun message).
    Dans ce cas, errno contient la valeur "EAGAIN". Donc tu peux tester si errno ne contient pas EAGAIN, t'es vraiment en erreur...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de lecture/écriture avec les sockets
    Par mrttlemonde dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 09/10/2009, 11h12
  2. Réponses: 4
    Dernier message: 23/10/2006, 16h17
  3. C -> Perl : Lecture ecriture sur des Sockets
    Par caesarvanou dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 05/05/2006, 11h20
  4. [VB6] Vérification des droits de lecture/écriture sur répert
    Par marsup54 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 01/02/2006, 18h41
  5. Lecture / écriture sur un port com
    Par dorian833 dans le forum C++
    Réponses: 7
    Dernier message: 07/07/2005, 15h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo