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 :

Socket : reception d'une chaîne avec sa taille


Sujet :

C++

  1. #1
    Membre du Club
    Femme Profil pro
    Etudiant en Intelligence Numérique
    Inscrit en
    Mars 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en Intelligence Numérique

    Informations forums :
    Inscription : Mars 2007
    Messages : 27
    Points : 42
    Points
    42
    Par défaut Socket : reception d'une chaîne avec sa taille
    Bonjour,

    Je me suis mis il y a peu (hier) à l'utilisation des sockets et j'ai donc décidé de créer deux classe pour pouvoir les gérer plus facilement (une pour le serveur, une pour le client). J'ai fais divers essaie en essayant d'envoyant une chaîne caractère (avec une tailleur de buffer prédéfini), un entier, une structure... ça marche à merveille. J'ai essayer ensuite d'envoyer plusieurs données à la suite, aucun problème... Et c'est justement ce qui est étrange, car lorsque j'envoie deux entiers à la suite, les deux sont bien reçu correctement, mais si j'envoie une chaîne avec sa taille (j'envoie d'abord la taille de la chaîne ensuite la chaîne en elle-même) je reçoit très bien la taille... mais je peux pas en dire autant de la chaîne :

    Autant dire que j'ai un peu de mal à saisir comment mon "bonjour" à pu se transformer en "T<-?".

    Voici les fonctions que j'utilise pour l'envoie :
    Côté serveur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void server::sendData(string data) {
    	sendData(data.size() + 1);
    	sendData(data.c_str(), data.size() + 1);
    }
     
    template <typename T> void server::sendData(T data, unsigned size) {
    	std::cout << "SEND" << std::endl;
    	std::cout << "data : " << data << std::endl;
    	send(_csocket, reinterpret_cast<char*>(&data), size ? size : sizeof(data), 0);
    }
    et côté 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
     
    template <typename T> T client::receiveData() {
    	T data;
    	if (!_connected) return data;
    	recv(_socket, reinterpret_cast<char*>(&data), sizeof(data), 0);
    	return data;
    }
     
    string client::receiveString() {
    	unsigned size = receiveData<unsigned>();
    	cout << "RECEIVE" << endl;
    	cout << "size : " << size << endl;
    	char *data = new char[size];
    	recv(_socket, data, size, 0);
    	cout << "data (char*) : " << data << endl;
    	string dataString(data);
    	cout << "data (string) : " << dataString << endl;
    	delete[] data;
    	return dataString;
    }
    Je sais que normalement il aurait fallut faire une boucle lors de la réception pour être sûr de recevoir le message en entier mais étant donné que le message reçu ne correspond à rien par rapport au message envoyé je pense pas que ça résoudrais mon problème (même si j'ajouterais quand même cette boucle une fois mon problème résolu).

    Voila, vous savez tout et donc j'espère que quelqu'un pourras m'aider à trouver d'où vient ce problème.

    Merci et bonne journée.

  2. #2
    Membre averti Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Points : 302
    Points
    302
    Par défaut
    Salut,
    A première vue, tu appliques la méthode sendData(T data, unsigned size) sur un const char*. Donc reinterpret_cast<char*>(&data) pose problème (&data est un pointeur de pointeur). Essaye avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void server::sendData(string data) {
    	sendData(data.size() + 1);
    	sendData(data[0], data.size() + 1);
    }
    pour voir.

  3. #3
    Membre du Club
    Femme Profil pro
    Etudiant en Intelligence Numérique
    Inscrit en
    Mars 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en Intelligence Numérique

    Informations forums :
    Inscription : Mars 2007
    Messages : 27
    Points : 42
    Points
    42
    Par défaut
    Ca ne vient pas de là car lorsque j'envoie la chaine de la même manière mais sans la taille juste avant je la reçoit correctement. C'est juste le fait d'envoyer (ou de recevoir?) la taille juste avant qui fait bugger.

  4. #4
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 474
    Points
    11 474
    Billets dans le blog
    11
    Par défaut
    C'est quoi la valeur de retour de recv ? normalement ça devrait être 7 (taille de bonjour) ou un code d'erreur (cf. ici)
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Membre du Club
    Femme Profil pro
    Etudiant en Intelligence Numérique
    Inscrit en
    Mars 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en Intelligence Numérique

    Informations forums :
    Inscription : Mars 2007
    Messages : 27
    Points : 42
    Points
    42
    Par défaut
    Ca m'apprendra à ne pas lire la documentation... En effet recv ne renvoyait pas la taille reçu mais pour ERROR_SOCKET, j'ai pu voir par la suite que l'erreur correspondante était dû au fait que le serveur de fermer trop tôt... J'ai rajouté un Sleep de 10s pour tester et ça marche parfaitement. Merci!

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

Discussions similaires

  1. Problème taille d'une chaîne avec length
    Par emmesse dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 03/03/2012, 11h19
  2. [Sql Server 8.0]Requête dans une chaîne avec Cursor à executer
    Par Nicodemus dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/11/2006, 17h34
  3. Réponses: 4
    Dernier message: 12/05/2006, 19h11
  4. [RegEx] Tester une chaîne avec ereg()
    Par Anduriel dans le forum Langage
    Réponses: 4
    Dernier message: 30/04/2006, 11h36
  5. [RegEx] Remplacer une chaîne avec preg_replace
    Par GregPeck dans le forum Langage
    Réponses: 3
    Dernier message: 08/12/2005, 12h21

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