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

MFC Discussion :

Utilisation des nombres dans Winsock2


Sujet :

MFC

  1. #1
    Membre actif Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Points : 272
    Points
    272
    Par défaut Utilisation des nombres dans Winsock2
    Voilà je voudrais faire une application qui se sert des sockets ( Winsock2 ) mais jusque là rien de ce que je n'ais vu ne traitait de comment envoyer ( et recevoir des nombres ) pourtant cela me semble indispensable...
    Donc j'imagine qu'il n'existe aucun moyen direct d'envoyer des nombres... mais alors comment me conseillez vous de faire ? parce que j'ais pensé faire comme si je traitais du texte mais je ne vois vraiment pas comment m'en sortir...

    Merci d'avance

    [EDIT] PS: j'ais essayé la solution de la FAQ ici mais bizarrement, quand je converti de string vers entier, si le nombre dépasse 9999, il me le coupe pour qu'il soit < 10000 [/EDIT]

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    tout depend de ton application si elle tourne sur la meme plateforme materiel entre le client et le serveur et limité a un lan.
    au risque de faire huler les puristes dans ce cas tu peux envoyer le nombre sous forme d'echanges binaires.
    sinon il faut adopter une convention d'echanges l'ascii peut etre une solution.
    bon j'utilises pas trop la stl pour ce genre de convertion (par manque d''habitude ).
    transformation d'un entier en chaine.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CString str;
    str.Format("%d",10);

  3. #3
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Tu peux envoyer directement des nombres mais il faut être prudent et utiliser des fonctions comme htons/htonl.
    Pour ton probleme de conversion avec ostringstream en effet c'est très louche. Comment fais-tu ?

  4. #4
    Membre actif Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Points : 272
    Points
    272
    Par défaut
    Bon, juste avant d'envoyer ce message, je me suis apperçu que la solution de la FAQ fonctionnait maintenant:

    côté client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char buffer[255];
    recv(sock, buffer, sizeof(buffer), 0);
    // créer un flux à partir de la chaîne à convertir
    std::istringstream iss( buffer );
    // convertir en un int
    int nombre;
    iss >> nombre; 
    printf("%d \r\n", nombre);
    et côté serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    nombre = nombre;
    oss << nombre;
    // récupérer une chaîne de caractères
    std::string result = oss.str();
    send(csock, result.data(), 14, 0);
    Je ne vois pas vraiment de raison qui justifient le fait que hier ça ne marche pas ( si ce n'est que j'ais changé de PC ) mais comme cela marche...

    Citation Envoyé par Aurelien.Regat-Barrel
    Tu peux envoyer directement des nombres mais il faut être prudent et utiliser des fonctions comme htons/htonl.
    En utilisant send pour envoyer ?? je dois avouer que je ne comprend pas très bien

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut Re: Utilisation des nombres dans Winsock2
    Citation Envoyé par DeusXL
    [EDIT] PS: j'ais essayé la solution de la FAQ ici mais bizarrement, quand je converti de string vers entier, si le nombre dépasse 9999, il me le coupe pour qu'il soit < 10000 [/EDIT]
    j'ai essayé avec 200001 pas de pb ça fonctionne.

  6. #6
    Membre actif Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Points : 272
    Points
    272
    Par défaut
    A mon avis le problème venait plutôt de la transmission car en regardant, le char aussi ne contenait qu'un nombre < 10000 ( problème du buffer ? )

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    pour le send pourquoi tu ne fais pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    send(csock, result.data(), result.size()+1 , 0);
    la longueur de la chaine +1 pour le zero.

  8. #8
    Membre actif Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Points : 272
    Points
    272
    Par défaut
    En effet ... je ne l'avais pas vu celui là ( le 14 doit être un reste de copier-collers mal faits )

  9. #9
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    un autre detail pour une gestion correcte des transmissions c'est le meme combat que le port serie
    il faut travailler en asynchrone avec un buffer de recouvrement.
    En gros l'equivalent de la classe CAsyncSocket des MFC .
    sur codeguru il y a gars qui a fait un tres bon travail
    sur une classe asynchrone avec les sockets 2 et des threads pour la gestion des clients.
    cette classe a l'avantage de fonctionner en mode console, ce n'est pas le cas de la classe MFC sauf en magouillant un peu.
    http://www.codeguru.com/Cpp/I-N/network/winsocksolutions/article.php/c5449/

  10. #10
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    pour les pb de codification des nombres
    voir aussi cet article sur codeproject:
    http://www.codeproject.com/cpp/endianness.asp

  11. #11
    Membre actif Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Points : 272
    Points
    272
    Par défaut
    Je fais remonter mon sujet car j'ais une nouvelle question et j'estime que ça ne vaut pas le coups de créer un nouveau topic comme c'est en rapport.

    J'utilise plutôt des std::string car je les trouve pratiques mais j'ais un problème:
    send demande en 2ème paramètre un char*, j'ais donc fait char buffer[256] puis std::string buffer2(buffer); Tout marche mais j'ais un petit problème, c'est que je ne connais pas la taille des paquets que le serveur envoie ( cela peut varier )... je vois plusieurs solutions a ce problème :
    -Régler pour que le serveur envoie toujours des paquets de X lettres mais je trouve cela perte de temps en ce monde ( et surtout cela risque de surcharger la bande passante pour des paquets minuscules, arrêtez moi si je me trompe )
    -Où alors, la solution miracle, je peux trouver un moyen avec std::string sans passer par un char de créer un buffer de la bonne taille. C'est a dire obtenir la taille de l'info envoyer par le serveur...
    Si je met char buffer[256] et que le char envoyé par le serveur est de 10, cela me fait 246 caractères étranges ( que l'on peut facilement supprimer mais qui ont variés selon les applications que j'ais vu avec les sockets )

  12. #12
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    et bien tu envois avant la longueur de ce qui suit :
    Si c’est une chaîne elle aura une longueur fixe par exemple 4 crts et contiendra la longueur de la data a envoyer .
    Coté réception tu commences par lire 4 octets pour savoir la longueur de ce qui reste a lire.

  13. #13
    Membre actif Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Points : 272
    Points
    272
    Par défaut
    Je pensais aussi à autre chose, j'ais remarqué que sur beaucoup de prog que j'ais fais avec les sockets, les caractères non remplits commençaient par un 'Ì', je me trompe ?


    [EDIT] j'ais essayé cela et ca a l'air de marcher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::string fonction(char* tempbuffer, int charlenght)
    {
    	int i = 0;
    	while(tempbuffer[i] != 'Ì') { i++; }
    	for(i; i < charlenght; i++) {tempbuffer[i] = NULL; };
    	return std::string(tempbuffer);
    };
    [/EDIT]

  14. #14
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 150
    Points : 180
    Points
    180
    Par défaut
    ben aouais c'est soit le tas en release soit cdcdcdcd en debug

  15. #15
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    Citation Envoyé par DeusXL
    les caractères non remplits commençaient par un 'Ì', je me trompe ?
    oui, ca peut etre n'importe quoi en fait, il faut qu'à la fin de ta chaine, tu mettes un '\0', si ta fonction de socket te retourne le nombre de caractères lu dans ton buffer, à cette position, tu mets un caractère de fin de chaine

Discussions similaires

  1. utilisation des panel dans une fenetre Win32
    Par ksoft dans le forum MFC
    Réponses: 1
    Dernier message: 02/05/2006, 21h45
  2. probleme de trie des nombres dans mysql
    Par fwdavy dans le forum Administration
    Réponses: 3
    Dernier message: 23/03/2006, 21h31
  3. [MySQL] Additionner des nombres dans un array
    Par azorol dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 10/02/2006, 11h34
  4. [XSL] Utiliser des CSS dans un fichier XSL
    Par alainme dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 13/04/2005, 10h47
  5. [VB.NET] Utilisation des sessions dans Session_End ?
    Par San Soussy dans le forum ASP.NET
    Réponses: 2
    Dernier message: 02/02/2005, 16h40

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