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

Réseau C Discussion :

Problème de sockets asynchrones


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Etudiant
    Inscrit en
    Février 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 115
    Par défaut Problème de sockets asynchrones
    Bonsoir,

    J'implémente actuellement un protocole (RTCP) qui m'impose d'envoyer un packet UDP de ma machine A vers le serveur B. A la réception du packet, le serveur B va renvoyer un packet de réponse vers la machine A en UDP.

    L'idée c'est que quand le réseau est bien pourrit, mon programme qui effectue un traitement est complètement bloqué car il est en attente de la réponse via recvfrom().

    On m'a donc aiguillé sur select() et sur fcntl() mais ça ne marche pas comme prévu... En gros actuellement ça marche bien pour 2 envoi/réponses puis silence radio, plus aucun packet n'est reçu par le serveur. Je m'arrache les cheveux dessus, si quelqu'un pouvait m'aider...

    Le but recherché étant juste d'envoyer des packets vers le serveur toutes les 5s et de récupérer les réponses une par une quand elles arrivent sans faire planter tout mon programme...

    Les 2 premières ligne sont de l'objective-C m'enfin tout le reste est du C pur. La pour info la méthode sendRTCP() est appelée environ toutes les 0.5s dans un traitement "temps réel"

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    -(void)sendRTCP{
            NSDate* now = [NSDate date];
            // envoi toutes les 5s
            if ((_sentRTCPAudio == nil) || ([now timeIntervalSinceDate:_sentRTCPAudio] >= 5))
            {
                    // si le file descriptor n'est pas initialisé, le faire
                    if(!_fdRTCPAudio){
                            // socket
                            if( (_fdRTCPAudio = socket(AF_INET,SOCK_DGRAM,0)) < 0){
                                    perror("rtcp aq fd failed");
                            }
                            // socket non bloquante ?
                            fcntl(_fdRTCPAudio, F_SETFL, O_NONBLOCK);
     
                            // select ?
                            FD_ZERO(&_readfs);
                            FD_SET(_fdRTCPAudio, &_readfs);
     
                            // initialisation de l'adresse de destination
                            bzero(&_audioServaddr,sizeof(_audioServaddr));
                            _audioServaddr.sin_family = AF_INET;
                            _audioServaddr.sin_addr.s_addr=inet_addr(_audioIP);
                            _audioServaddr.sin_port=htons(_rtcpAudio);
                            bind(_fdRTCPAudio, (struct sockaddr *)&_audioServaddr, sizeof(_audioServaddr));
                    }
                    uint8_t buf[7 * sizeof(uint32_t)];
                    // ... on remplit le buffer
                    int lenRTCP = 28;
     
                    // on envoi le buffer
                    if(sendto(_fdRTCPAudio,buf,lenRTCP,0,(struct sockaddr *)&_audioServaddr,sizeof(_audioServaddr)) < 0){
                            perror("rtcp aq failed here");
                            close(_fdRTCPAudio);
                            _fdRTCPAudio = nil;
                    }
     
                    // buffer de reponse
                    unsigned char msg[50]; int n;
                    bzero(msg, 50);
     
                    // timeout sur le select
                    struct timeval tv;
                    tv.tv_sec = 0;
                    tv.tv_usec = 200;
                    int retval = select(_fdRTCPAudio + 1, &_readfs, NULL, NULL, &tv);
                    if(retval == 0)
                    {
                            printf("isset : )\n");
                            socklen_t len = sizeof(_servaddr);
                            if((n = recvfrom(_fdRTCPAudio,msg,sizeof(msg)-1,0,(struct sockaddr *)&_servaddr,&len)>0))
                            {
                                    // reception de msg
                            }
                    }
                    printf("rtcpAQ sent\n");
            }
    }

  2. #2
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 872
    Par défaut
    Tu recrees la socket a chaque fois que t'appelles cette fonction ? Mauvaise idee, sans parler du fait que tu ne la liberes jamais via un close (ou closesocket si t'es sous windows).

    Commence deja par regler ca.

  3. #3
    Membre actif
    Homme Profil pro
    Etudiant
    Inscrit en
    Février 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 115
    Par défaut
    Je garde la même socket pour tout le programme Ma socket est créée au tout premier appel de ma fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // si le file descriptor n'est pas initialisé, le faire
    if(!_fdRTCPAudio)
    A la fermeture du programme, je fais bien sur :
    close(_fdRTCPAudio)
    _fdRTCPAudio = 0;

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    on doit utiliser shutdown...

  5. #5
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 872
    Par défaut
    Un shutdown ne ferme pas completement la socket, il ne fait que couper ses echanges. Le close ferme en plus le file descriptor. Donc si on utilise shutdown il faut utiliser un close derriere mais si on close la socket, on n'a pas besoin d'appeler shutdown.

Discussions similaires

  1. Socket Asynchrone - Problème lors de surcharge
    Par NeoKript dans le forum Réseau
    Réponses: 0
    Dernier message: 05/11/2011, 17h03
  2. Problème socket asynchrones
    Par pictom41 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 27/07/2009, 14h50
  3. Problème socket asynchrone
    Par touys dans le forum Windows
    Réponses: 1
    Dernier message: 30/04/2007, 16h34
  4. [Kylix] Problème de socket
    Par RaygKross dans le forum EDI
    Réponses: 1
    Dernier message: 01/03/2004, 19h41
  5. Mysql ne se lance pas problème de socket
    Par Riko dans le forum Installation
    Réponses: 5
    Dernier message: 05/02/2004, 09h28

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