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

C Discussion :

Liste chaine + recvfrom


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Avril 2012
    Messages : 15
    Points : 12
    Points
    12
    Par défaut Liste chaine + recvfrom
    Bonjour,

    J'ai besoin de récupérer dans une liste chainé les packet UDP (4 packets) avec recvfrom(); cependant lorsque je retourne ma liste le pointeur sur la structure suivante vaut NULL donc je ne peux afficher qu'une seul liste (celle que je retourne), j'ai une fonction afficher(); qui me permet d'afficher toutes les listes chainée qui elle fonctionne bien, le problème se pose donc sur ma fonction de récupération des 4 packets UDP ci-dessous :

    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
     
    DECOUPE_TIF_STRUC			       *recv_data(int sock)
    {
    	int						nOctets;
    	int						i;
    	SOCKADDR_IN				sin = {0};
    	int						sinsize = sizeof(sin);
    	unsigned char 			        buffer[65508] = {0};
    	DECOUPE_TIF_STRUC		       *new_t = NULL;
    	DECOUPE_TIF_STRUC		       *temp = NULL;
    	for(i = 0; i < 4; i++)
    	{
    		new_t = (DECOUPE_TIF_STRUC*)malloc(sizeof(*new_t));		
    		new_t->next = NULL;
    		if (new_t == NULL)
    			return (temp);
    		if ((nOctets = recvfrom(sock, (char *)new_t->data, sizeof(buffer), 0, (SOCKADDR *)&sin, &sinsize)) == SOCKET_ERROR)
    		{
    			perror("recvfrom()");
    			wprintf(L"bind failed with error %d\n", WSAGetLastError());
    			exit(errno);
    		}
    		buffer[nOctets] = '\0';	
    		//printf("NOCTET : %d\n", nOctets);
    		if (i == 0)
    		{
    			 temp = new_t;
    		}
    	}
    	return (temp);
    }
    Lorsque je change la condition du i == 0 par i == 1 ou 2 ou 3 j'affiche respectivement les packets 0,1,2,3. Je pensais qu'il suffisait que je renvoie la structure de i == 0 la première donc pour pouvoir accéder au suivante, mais non...

    Merci pour votre aide !

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Tu n'as pas construit du tout une liste chainée : on ne voit nulle part comment chaque enregistrement est lié aux enregistrements précédents.
    Chaque nouvelle allocation a son adresse mise dans new_t en écrasant l'adresse de l'allocation précédente.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Avril 2012
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Merci diogene de ta réponse, j'y voit un peu plus clair.

    Pourrais-tu, s'il te plait, si tu as le temps me faire une ébauche de la bonne manière à suivre selon mon code ?

    Par avance merci.

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Oui, regarde dans la faq. C'est expliqué.

    Je te laisse chercher dedans, tout est bon à lire
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Avril 2012
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Oui j'avais déjà épluché la FAQ C et les Cours C, ce qui m'a permis d'en arriver là, cependant ce qui est commun à chaque faq est que pour insérer une nouvelle list, ils passent par des fonctions et passe en paramètre la structure précédente ainsi que la donnée à insérer et renvoie un pointeur d'une structure, mais je ne peux faire cela car le temps de copier les données (strcpy) dans la structure je perds les packets(UDP), je dois donc spécifier directement en 2ème paramètre à recvfrom() la nouvelle structure new_t->data et la je bloque totalement.

    Est-ce possible de faire comme sa ?

    Si oui si tu pouvais reprendre mon code et le modifier je t'en serai grandement reconnaissant, car tu as l'air d'être expert dans ce domaine.

    Cordialement.

    PS : Je ne suis pas adepte du copier collé à moins de comprendre ce que cela fait.

  6. #6
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Pourquoi ne pas allouer dynamiquement un tableau de 4 DECOUPE_TIF_STRUC, les remplir par recvfrom() et renvoyer l'adresse du premier élément de ce tableau ?
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 08/02/2005, 23h42
  2. Bibliothèque de listes chainées
    Par gege2061 dans le forum C
    Réponses: 29
    Dernier message: 17/12/2004, 20h15
  3. copie de liste chainée
    Par tomsoyer dans le forum C++
    Réponses: 15
    Dernier message: 31/08/2004, 18h20
  4. Trie liste chaine
    Par Congru dans le forum C
    Réponses: 2
    Dernier message: 30/03/2004, 19h05
  5. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25

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