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 :

Réception de packet


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Doctorant
    Inscrit en
    Juin 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant

    Informations forums :
    Inscription : Juin 2008
    Messages : 25
    Par défaut Réception de packet
    Bonjour à tous

    Je programme un peu en C et je me suis mis au C++ depuis une semaine.
    Je suis en stage et je dois travailler sur une application afin de réceptionner des datas via UDP.

    Voici ce que j'ai pour l'instant (c'est un gros du copier/coller du site de MSDN ) :
    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
    void main()
    {
     
    	WSADATA wsaData;
    	SOCKET RecvSocket;
    	sockaddr_in RecvAddr;
    	int i=0;
    	int j=0;
    	int Port = 5000;
    	int  BufLen = 1024;
    	char RecvBuf[1024];
    	sockaddr_in SenderAddr;
    	int SenderAddrSize = sizeof(SenderAddr);
     
      //-----------------------------------------------
      // Initialize Winsock
    	WSAStartup(MAKEWORD(2,2), &wsaData);
     
      //-----------------------------------------------
      // Create a receiver socket to receive datagrams
    	RecvSocket = socket(AF_INET, SOCK_DGRAM, 0);
     
      //-----------------------------------------------
      // Bind the socket to any address and the specified port.
    	RecvAddr.sin_family = AF_INET;
    	RecvAddr.sin_port = htons(Port);
    	RecvAddr.sin_addr.s_addr = INADDR_ANY;
     
    	bind(RecvSocket, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr));
     
      //-----------------------------------------------
      // Call the recvfrom function to receive datagrams
      // on the bound socket.
    	for(j=0;j<256;j++)
    	{
                    printf("Receiving datagrams...\n");
    		recvfrom(RecvSocket, (char*)RecvBuf, BufLen, 0, (SOCKADDR *)&SenderAddr, &SenderAddrSize);
    		parse((char*)RecvBuf,BufLen);
    		printf("\n");
    	}
     
      //-----------------------------------------------
      // Close the socket when finished receiving datagrams
    	printf("Finished receiving. Closing socket.\n");
    	closesocket(RecvSocket);
     
      //-----------------------------------------------
      // Clean up and exit.
    	printf("Exiting.\n");
    	WSACleanup();
    	return;
    }
    - La fonction parse est ma fonction qui s'occupe de gérer les packet et de faire tout ce qu'il faut avec.
    - La boucle for contenant le recvfrom sera remplacée par la suite par une boucle while avec les conditions adéquates.

    Mon problème est le suivant :
    Je souhaite récupérer l'intégralité des packets et en perdre un minimum (aucun serait évidemment l'idéal) avec un minimum de latence. La première idée qui a été développée est d'utiliser une horloge pour récupérer les packets tous les x ms synchronisées avec l'envoi par le client mais je souhaiterais pouvoir scruter la socket et récupérer le packet dès qu'il est arrivé complet sur la socket. Ainsi je pourrais me débarrasser de l'horloge et récupérer l'intégralité de mes packets sans en perdre.

    Savez-vous ce que je peux utiliser pour remplacer ou compléter mon recvfrom afin d'attendre qu'un packet complet soit arrivé pour le récupérer et exécuter la fonction parse ?

    Merci à tous

    Thomas

  2. #2
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Mon problème est le suivant :
    Je souhaite récupérer l'intégralité des packets et en perdre un minimum (aucun serait évidemment l'idéal) avec un minimum de latence. La première idée qui a été développée est d'utiliser une horloge pour récupérer les packets tous les x ms synchronisées avec l'envoi par le client mais je souhaiterais pouvoir scruter la socket et récupérer le packet dès qu'il est arrivé complet sur la socket. Ainsi je pourrais me débarrasser de l'horloge et récupérer l'intégralité de mes packets sans en perdre.
    Il est souvent déconseillé de travailler en mode synchone, c'est souvent le meilleur moyen de perdre des données.
    Dans ton cas, je créerais un thread (par exemple en s'appuyant sur la bibliothèque pthread) dédié à la réception des données et j'avertirais le thread de traitement des données reçues via un principe d'inter-communication entre threads (signal, message etc...).


  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Pour compléter la réponse, je dirais:
    -> un thread dédié à la réception de tes packets et l'utilisation du select pour surveiller l'activité
    -> un thread pour analyser tes données et contrôler le thread précédent.
    Pour ne pas perdre trop de packet, joue aussi sur la taille des buffers de réceptions.
    De toute façon, en UDP tes packets pourront être perdus ailleurs dans le réseau. Rien ne garantie qu'ils arriveront jusqu'à ta machine. D'ailleurs, rien ne garantie qu'ils arriveront dans un ordre identique à l'émission. (émission P1, P2, P3,P4, réception possible: P2,P4,P1).

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

Discussions similaires

  1. Problème de réception de packets
    Par PNL dans le forum Java ME
    Réponses: 5
    Dernier message: 08/02/2008, 09h11
  2. Réponses: 15
    Dernier message: 04/01/2007, 11h15
  3. Réception sur le port série sous DOS avec Borland V3.0
    Par jackyjacky dans le forum Autres éditeurs
    Réponses: 24
    Dernier message: 19/03/2004, 23h18
  4. plantage lors de réception de fihier
    Par marsupile dans le forum C++Builder
    Réponses: 9
    Dernier message: 22/01/2004, 18h08
  5. Packet forwarder
    Par Gabuzomeu dans le forum Développement
    Réponses: 3
    Dernier message: 03/06/2003, 17h44

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