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 :

[sockets TCP] pb envoi de chaines, char :s


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 37
    Points : 24
    Points
    24
    Par défaut [sockets TCP] pb envoi de chaines, char :s
    Bonjour à tous, voila 3 jours que l'on bloque sur un problème qui doit être con !

    On crée une struture objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    typedef struct
    {
    	int num; 
          	char categorie [MAXT];
          	char titre [MAXT]; 
          	char description [MAXT];   
          	int duree;
          	int prix_depart;
          	int prix_reserve;  
    	int termine; 
    } objet;
    Ensuite, voila comment sont remplies les variables :

    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
     
    	ssize_t lu; 
       	char choix[MAXT];   	
    	int pid = getpid(); 
    	int cpt=0;
    	int duree,prix_d,prix_r;
    	objet obj;
    	obj.num=nbo;
     
     
    	do{
      		lu = recv(f,choix,MAXT,0);	//on lit ce qu'il y a sur le buffer et le met ds choix
    		switch (cpt)
    		{
    			case 0: strcpy(obj.categorie,choix);break;  // d'abord on remplit la categorie ... 
    			case 1: strcpy(obj.titre,choix);break;
    			case 2: strcpy(obj.description,choix);break;
    			case 3: sscanf(choix,"%d",&duree);obj.duree=duree;break;
    			case 4: sscanf(choix,"%d",&prix_d);obj.prix_depart=prix_d;break;
    			case 5: sscanf(choix,"%d",&prix_r);obj.prix_reserve=prix_r;break;
    		}
    		cpt++;
     
     
     
     
    	} while (cpt<6);
    	tab[nbo]=obj;
    	nbo++;
    	obj.termine = 0;

    Maintenant, on envoie les valeurs des variables au client :

    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
     
    ssize_t lu; 
       	char choix[MAXT]; char nbobj[MAXT]; char num_obj[MAXT]; char prix[MAXT];char tmp[MAXT];
    	int pid = getpid(); 
    	int duree,prix_d,prix_r;
    	objet obj;
    	obj.num=nbo;
    	int cpt=0,i=0;
     
     
     
     
    			sprintf(nbobj,"%d",nbo);
    			strcat(nbobj,"\n");
    			cpt=write(f,nbobj,strlen(nbobj));			
     
     
     
    				sprintf(num_obj,"%d",tab[0].num);
    				strcat(num_obj,"\n"); 
    				cpt=write(f,num_obj,strlen(num_obj));
    				printf("%d\n",cpt);				
     
    				strcat(tab[0].titre,"\n");
    				cpt=write(f,tab[0].titre,strlen(tab[0].titre));	
    				printf("%d\n",cpt);
     
    				strcat(tab[0].description,"\n");
    				strcpy(tmp,tab[0].titre);
    				cpt=write(f,tab[0].description,strlen(tab[0].description));	
    				printf("%d\n",cpt);
     
    				sprintf(prix,"%d",tab[0].prix_depart);
    				strcat(prix,"\n"); 
    				cpt=write(f,prix,strlen(prix));
    				printf("%d\n",cpt);
    Alors du coté client (en java), c'est EXACTEMENT le même alogo, mais dans l'autre sens !

    Le problème est, que dès que le client recoit Titre, Categorie, ou Description, ça beugue.
    Par exemple, si on se contente d'envoyer num_obj, ou prix, pas de problèmes !
    Mais dès que c'est un char (titre, description...), le PREMIER envoie/reception fonctionne, mais pour les suivants, le client recoit que du vide

    Tous les envois/réceptions sui suivent l'envoie d'un char ne fonctionnent plus! C'est trop bizzard.

    On a tout testé, avec les write, ou les send, même problème.

    On dirait que ça vient des chars, mais d'ou exactement?

    Merci bcp, dans l'espoir que vous allez m'aider svp !

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par sqwam71
    Alors du coté client (en java), c'est EXACTEMENT le même alogo, mais dans l'autre sens !

    Le problème est, que dès que le client recoit Titre, Categorie, ou Description, ça beugue.
    Par exemple, si on se contente d'envoyer num_obj, ou prix, pas de problèmes !
    Mais dès que c'est un char (titre, description...), le PREMIER envoie/reception fonctionne, mais pour les suivants, le client recoit que du vide
    Avant de se plonger dans le code, quelles études préalables ont été faites ? Un format indépendant de toute implémentation a-t-il été défini pour transporter les données ? (Texte, binaire) ?
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 37
    Points : 24
    Points
    24
    Par défaut
    Oui !

    On envoie et recoit tout en texte. Ex : les entiers sont transformés en texte grâce à l'instruction sprintf(nbobj,"%d",nbo); et ça fonctionne !

    Mais pour les char ?????? on ne voit pas.

    à l'aide svp

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par sqwam71
    On envoie et recoit tout en texte. Ex : les entiers sont transformés en texte grâce à l'instruction sprintf(nbobj,"%d",nbo); et ça fonctionne !
    C'est du codage terminal, mais moi, je parle d'organisation des données.
    Mais pour les char ?????? on ne voit pas.

    à l'aide svp
    Si tu parles des chaines de caractères, il faut déterminer un format adéquate.

    Il y a plusieurs façons de faire. Il est d'usage de s'inspirer du format CSV, par exemple :
    • Chaque enregistrement est composé d'une ligne de texte :
    • Un enregistrement comporte un nombre fixe de champs de données séparés par un caractère adéquate (,;!#§ etc., peu importe). Il faut que ce caractère ai peu de chances de se trouver dans les données) :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      enregistrement ::= <champ>[SEP<champ>[*]]
    • Un champ de donné est codé en texte. Les données texte sont laissée telle quelles, les données numériques sont codées en décimal. Les flottants sont codés en virgule fixe ou en notation scientifique avec E.
    • Un champ non utilisé (ignoré) est laissé vide :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      <champ>SEP VOID SEP<champ>EOL
      Il n'est pas interprété, la valeur du champ est laissée inchangée. On ne peut donc pas transporter de 'chaine vide'[1]
    • VOID est 'rien', c'est à dire que les séparateurs sont 'collés'. Par exemple :
      "hello,,world\r\n"
    • La table de caractères (charset) est ASCII (0-127). On évite le 0 qui complique les traitements. Si on a besoin de caractères supplémentaires, il faut envisager un charset étendu. L'important est qu'il soit correctement défini.
    • EOL est la marque de fin de ligne. C'est généralement une séquence CRLF, soit en ASCII les caractères CR (13 ou '\r') et LF (10 ou '\n').

    Bref, une spécification d'échange de données, ça ne tombe pas du ciel, il faut y réfléchir... J'attends donc le fruit de ta reflexion...

    Rien de tout cela n'a à voir avec les langages C ou Java, on est bien d'accord ?

    -------------------------------------
    [1] Si cette disposition ne convient pas, il faut encadrer les champs textes de "", mais c'est légèrement plus complexe. On peut aussi considérer qu'un champ 'vide' est une erreur...
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 37
    Points : 24
    Points
    24
    Par défaut
    On est d'accord mais justement je ne vois pas le rapport. Je veux juste envoyer des chaines de caractères de mon serveur en C, à mon client.

    Les entiers, pas de prob, pour les chaines, je ne vois pas pkoi ça bloque ! On galère toujours dessus, rien ni fait, ça parait correcte pourtant.

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par sqwam71
    On est d'accord mais justement je ne vois pas le rapport. Je veux juste envoyer des chaines de caractères de mon serveur en C, à mon client.

    Les entiers, pas de prob, pour les chaines, je ne vois pas pkoi ça bloque ! On galère toujours dessus, rien ni fait, ça parait correcte pourtant.
    • De quelle façon émets-tu la chaine ?
    • De quelle façon la reçois-tu ?
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 37
    Points : 24
    Points
    24
    Par défaut
    Dans un premier temps; l'envoi se fait en java ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    PrintWriter sisw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(soc.getOutputStream())),true);
     
    sisw.println("ma_chaine");
    ...Et la réception en C (je rempli mes variables CF. DéBUT POST).

    Puis le serveur renvoi tout au client (rep2=bf.readLine(); ) qui affiche au fur et à mesure (cf. début post).

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par sqwam71
    Dans un premier temps; l'envoi se fait en java ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    PrintWriter sisw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(soc.getOutputStream())),true);
     
    sisw.println("ma_chaine");
    Je ne connais pas Java. C'est censé mettre quoi dans le tuyau ? "ma_chaine\n" ?
    ...Et la réception en C (je rempli mes variables CF. DéBUT POST).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            ssize_t lu; 
       	char choix[MAXT];
            /* */
      		lu = recv(f,choix,MAXT,0);
    C'est pas bon. Il faut :

    Voilà pour avoir une chaine valide.

    Après, il faudrait vérifier la présence du '\n', reconstituer les blocs de données qui seraient plus longs que la taille du buffer...

    http://emmanuel-delahaye.developpez....eaux.htm#texte
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Je ne connais pas Java. C'est censé mettre quoi dans le tuyau ? "ma_chaine\n" ?
    Oui println rajoute le caractère de saut de ligne.
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ça n'envoie pas des caractères unicode, java ?
    Il me semble qu'un char en java fait 16 bits, du genre UCS-2 ou UTF-16...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 25/03/2015, 09h24
  2. envoi de fichier via socket TCP
    Par thaiexpat dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 27/11/2013, 20h08
  3. [Débutant] Problème d'envoie avec Socket TCP
    Par LKThree dans le forum C#
    Réponses: 0
    Dernier message: 10/05/2013, 10h44
  4. Envoi structure sur socket TCP
    Par BlackVador dans le forum C
    Réponses: 6
    Dernier message: 05/01/2011, 13h15
  5. Envoi/reception tableau byte socket TCP
    Par jhon_milou dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 01/06/2007, 11h40

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