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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 confirmé
    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
    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.

  3. #3
    Membre averti
    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
    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

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    Par défaut
    Oui, regarde dans la faq. C'est expliqué.

    Je te laisse chercher dedans, tout est bon à lire

  5. #5
    Membre averti
    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
    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 confirmé
    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
    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 ?

+ 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