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 :

Reception d'un tableau de taille inconnue


Sujet :

Réseau C

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 96
    Points : 51
    Points
    51
    Par défaut Reception d'un tableau de taille inconnue
    Bonsoir,

    En utilisant les sockets, un serveur reçoit un tableau d'entier de taille inconnue, la communication est basé sur le protocole TCP.

    la solution utilisée est de continuer à recevoir "TMAX" octets tant que le nombre d'octet reçu est égale TMAX et pour ne pas se bloquer sur la dernière réception on utilise la fonction ioctl pour rendre l'appel du recv non bloquant.

    j'ai essayé avec le code ci apres, mais quelque chose ne tourne pas rond
    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
     
     
    ...
    	/* reception du tableau */
     
    	int buffer = malloc(sizeof(int)*TMAX );
     
    	int totalRecu =0,
    	    tailBuffer = sizeof(int)*TMAX ; //nombre d'octet dans buffer
     
    	char copy = (char *)buffer ; 
     
    	do{
     
    		nbByte = recv(sock_trans,copy,TMAX ,0);
     
     		totalRecu += nbByte ;
     
    		if(tailBuffer < totalRecu){
    			/*reallocation de l'espace memoire */
    			buffer = realloc(buffer, tailBuffer + TMAX );
    			tailBuffer += TMAX  ;
    		}
     
    		/*incrementation du pointeur */
    		copy = copy + nbByte ;	// là je ne suis pas sûr ???!!!
     
     
    	}while(nbByte == TMAX) ;
    Merci d'avance pour vos précieuses remarques
    E.Bazoga

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 360
    Points : 23 599
    Points
    23 599
    Par défaut
    Bonsoir,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	int buffer = malloc(sizeof(int)*TMAX );
    C'est « char * buffer = … » qu'il aurait fallu déclarer ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	int copy = (char *)buffer ;
    Ceci n'a aucun sens.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	}while(nbByte == MAX_SIZE) ;
    À vue de nez, j'aurais surtout écrit « while(nbByte == TMAX) ».

    Bon courage.

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 96
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    ....

    À vue de nez, j'aurais surtout écrit « while(nbByte == TMAX) ».

    Bon courage.
    Merci pour vos remarques,

    NB: quand j'initialise TMAX a 1, le code s’exécute sans problème, par contre si TMAX = 3, j'ai le message d'erreur suivant :
    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
     
    *** glibc detected *** ./serveur: realloc(): invalid next size: 0x0804
    a008 ***
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6[0xb7e34803]
    /lib/tls/i686/cmov/libc.so.6(realloc+0x10b)[0xb7e3675b]
    /lib/tls/i686/cmov/libc.so.6(realloc+0x3c)[0xb7e3668c]
    ./serveur[0x8048856]
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe0)[0xb7ddd450]
    ./serveur[0x80486c1]
    ======= Memory map: ========
    08048000-08049000 r-xp 00000000 08:01 361563     /home/sdamy/sources-C
    SD/src/interm/serveur
    08049000-0804a000 rw-p 00000000 08:01 361563     /home/sdamy/sources-C
    SD/src/interm/serveur
    0804a000-0806b000 rw-p 0804a000 00:00 0          [heap]
    b7c00000-b7c21000 rw-p b7c00000 00:00 0
    b7c21000-b7d00000 ---p b7c21000 00:00 0
    b7dc6000-b7dc7000 rw-p b7dc6000 00:00 0
    b7dc7000-b7f10000 r-xp 00000000 08:01 328677     /lib/tls/i686/cmov/li                          bc-2.7.so
    b7f10000-b7f11000 r--p 00149000 08:01 328677     /lib/tls/i686/cmov/li                          bc-2.7.so
    b7f11000-b7f13000 rw-p 0014a000 08:01 328677     /lib/tls/i686/cmov/li                          bc-2.7.so
    b7f13000-b7f16000 rw-p b7f13000 00:00 0
    b7f18000-b7f22000 r-xp 00000000 08:01 311899     /lib/libgcc_s.so.1
    b7f22000-b7f23000 rw-p 0000a000 08:01 311899     /lib/libgcc_s.so.1
    b7f23000-b7f26000 rw-p b7f23000 00:00 0
    b7f26000-b7f27000 r-xp b7f26000 00:00 0          [vdso]
    b7f27000-b7f41000 r-xp 00000000 08:01 311904     /lib/ld-2.7.so
    b7f41000-b7f43000 rw-p 00019000 08:01 311904     /lib/ld-2.7.so
    bf8ad000-bf8c2000 rw-p bffeb000 00:00 0          [stack]
     ==== Serveur connected to interm 1088===Abandon

  4. #4
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Tu n'utilise pas la bonne méthode pour recevoir un tableau en TCP:

    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
     
    struct reseau {
    int size;
    int* tab;
    }
     
    //coter serveur
    int *receive(int socket)
    {
      struct reseau tmp;
      read(socket,&tmp,sizeof(tmp));
      tmp.tab = malloc(tmp.size*sizeof(int));
      recv(socket,tmp.tab,tmp.size*sizeof(int),0);
      return (tmp.tab);
    }
     
    //coter client
    void send(int* tab, int socket)
    {
      struct reseau tmp;
      tmp.tab = tab;
      tmp.size = mafonctionquicalcullatailledutableau(tab);
      write(socket, &tmp, tmp.size+sizeof(tmp));
    }
    PS:Je te laisse remplacer read et write par les fonctions que tu préfère et gérer aussi les retours de ces fonctions
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  5. #5
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 96
    Points : 51
    Points
    51
    Par défaut
    Merci "skeud" pour la réponse, mais dans ton code, le serveur connait la taille du tableau à recevoir.

  6. #6
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Non justement, d'ou l'utilité du champ size dans la structure c'est elle qui contient la taille du tableau.

    Cette taille est envoyé par le client, et le client connait la taille du tableau normalement sinon c'est que tu as un soucis de conception
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  7. #7
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 96
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par skeud Voir le message
    Non justement, d'ou l'utilité du champ size dans la structure c'est elle qui contient la taille du tableau.

    Cette taille est envoyé par le client, et le client connait la taille du tableau normalement sinon c'est que tu as un soucis de conception
    Mais imagine un cas ou le client (qui cherche à complexer ma vie ) n'a pas envoyé la taille au serveur, et ce dernier doit récupérer le tableau, comment fait t-il pour l'avoir ?

  8. #8
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Si c'est toi qui code le client, normalement tu peux t'envoyer toi-meme la taille non? sinon va voir un medecin, pasque de la prog schyzophrene, c'est plutot rare.XD

    Plus serieuse;mment, si c'est pas toi qui creer le client, alors il faut IMPERATIVEMENT etablir un protocole de communication entre le client et le serveur.C'est la base de la programmation reseau, sinon sa serait un peu le bordel le monde de l'informatique reseau sans protocole
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  9. #9
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 96
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par skeud Voir le message
    Si c'est toi qui code le client ..
    Ce n'est pas toujours le cas, parfois on a aucun contrôle sur l’émetteur des données.

    Citation Envoyé par skeud Voir le message
    sinon va voir un medecin, ...
    peut être un jours, Merci pour le conseil.

Discussions similaires

  1. tableau a taille inconnue
    Par maryem_kh dans le forum C++
    Réponses: 5
    Dernier message: 10/11/2012, 14h35
  2. feuil qui contient un tableau de taille inconnu
    Par pikamo dans le forum Excel
    Réponses: 4
    Dernier message: 09/06/2011, 12h33
  3. Réponses: 5
    Dernier message: 02/05/2009, 16h27
  4. Selectionner un tableau de taille inconnue
    Par pythagore3_14 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/08/2008, 12h54
  5. Réponses: 9
    Dernier message: 02/08/2006, 12h31

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