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 :

Problème d'envoi reception winsock


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Verbalinsurection
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Septembre 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2007
    Messages : 127
    Par défaut Problème d'envoi reception winsock


    Alors voila mon souci, j'ai un programme client et un programme serveur. Le client se connecte au serveur et lui envoi 3 paramètre (utilisation de la fonction send() trois fois). Le serveur traite ces paramètre et doit envoyer une réponse au client, voici mon code :
    Coté 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
    bool verifMd5(string md5File, string addIp, int port, string ucName) {
        char recvbuf[DEFAULT_BUFLEN] = "";
        int recvbuflen = DEFAULT_BUFLEN;
        int iResult;
     
        string end = "END";
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2,0), &WSAData);
        SOCKET sock;
        SOCKADDR_IN sin;
        sock = socket(AF_INET, SOCK_STREAM, 0);
        sin.sin_addr.s_addr = inet_addr(addIp.c_str());
        sin.sin_family = AF_INET;
        sin.sin_port = htons(port);
     
        connect(sock, (SOCKADDR *)&sin, sizeof(sin));
        send(sock, ucName.c_str(), ucName.length(), 0);
    Sleep(500);
        send(sock, md5File.c_str(), md5File.length(), 0);
    Sleep(500);
        send(sock, end.c_str(), end.length(), 0);
     
        recv(sock, recvbuf, recvbuflen, 0);
     
        closesocket(sock);
        WSACleanup();
     
    cout << recvbuf << endl;
    system("PAUSE");
    }
    Coté serveur :
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    int main(void) {
     
        listenPort(1563);
        system("PAUSE");
    	return 0;
    }
     
    int attenteInfos(int port, string &fileNameFin, SOCKET csock, SOCKET sock) {
        char recvbuf[DEFAULT_BUFLEN] = "";
        int recvbuflen = DEFAULT_BUFLEN;
        int xCountMess = 1;
        string ucName;
        string md5;
        int devoirEnvoyer;
        string fileName;
     
        do {
            recv(csock, recvbuf, recvbuflen, 0);
            if (xCountMess == 1) {
                ucName = recvbuf;
                fileName = verifMachine(ucName);
            } else if (xCountMess == 2) {
                md5 = recvbuf;
            }
            xCountMess ++;
        } while (memcmp(recvbuf, "END", strlen("END")) != 0);
        if (fileName != "NULL") {
            if (testMd5(md5, fileName) == true) {
                devoirEnvoyer = 0;
            } else {
                devoirEnvoyer = 1;
            }
        } else {
            devoirEnvoyer = 1;
        }
        fileNameFin = fileName;
        return devoirEnvoyer;
    }
     
    void listenPort(int port) {
        string fileNameFin;
        int doitEnvoyer;
     
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2,0), &WSAData);
        SOCKET sock;
        SOCKET csock;
        SOCKADDR_IN sin;
        SOCKADDR_IN csin;
        sock = socket(AF_INET, SOCK_STREAM, 0);
        sin.sin_addr.s_addr	= INADDR_ANY;
        sin.sin_family = AF_INET;
        sin.sin_port = htons(port);
        bind(sock, (SOCKADDR *)&sin, sizeof(sin));
        listen(sock, 0);
        int sinsize = sizeof(csin);
        if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET) {
            doitEnvoyer = attenteInfos(port, fileNameFin, csock, sock);
        }
        send(sock, (const char*) doitEnvoyer, 1, 0);
     
        closesocket(sock);
        WSACleanup();
    }
    Tout fonctionne super bien à part que je dois utiliser la fonction sleep() ce qui me plait pas enormement et que le client ne reçoi rien pourtant la fonction recv() me parrait correct, un problème de timming entre client et serveur?

    Merci à ceux qui jetterons un oeil et me répondrons peut être...

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Le serveur peut recevoir le résultat de plusieurs send() avec un seul recv() (il aura le tout mis bout-à-bout). C'est comme ça TCP/IP, c'est un flux d'octets qui est envoyé.
    Pour contrer le phénomène, tu peux envoyer un séparateur entre chaque message et les lire caractère par caractère, ou bien envoyer la taille en premier, etc.
    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.

  3. #3
    Membre confirmé Avatar de Verbalinsurection
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Septembre 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2007
    Messages : 127
    Par défaut
    Ok merci ça va certainement résoudre le problème des sleep, mais pour la réponse envoyé par le serveur?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Fais tourner ton serveur dans un bon debugger et vérifie qu'il quitte bien la boucle après avoir reçu le dernier message...
    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.

  5. #5
    Membre confirmé Avatar de Verbalinsurection
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Septembre 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2007
    Messages : 127
    Par défaut
    oui il quitte bien la boucle

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Juste une remarque pas méchante dans l'ecriture de ton code

    Tu as tendance à écrire sans jamais tester les codes de retour de fonction.

    Certains codes de retour doivent impérativement être testés sous peine d'avoir un programme qui marche ou qui ne marche pas sans que l'on sache pourquoi.

    Typiquement, je prend ton code coté client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    connect(sock, (SOCKADDR *)&sin, sizeof(sin));
    ...
    Que ce passe t'il si la connexion échoue ?
    1/ il n'y a pas de message d'avertissement
    2/ le client continue quand même ses send() et recv() avec un socket invalide

    C'est la même chose du côté serveur dans la fonction listenPort()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    bind(sock, (SOCKADDR *)&sin, sizeof(sin));
    listen(sock, 0);
    ...
    si le bind échoue (parcequ'un autre programme à déjà bindé le port par exemple), tu continue quand même avec un socket invalide

    Donc je te conseille de surveiller tes codes de retour, de plus, cela te permet de te poser les questions du style "Qu'est ce que je dois faire comme action s'il me retourne cette valeur ?"

    Raymond
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

Discussions similaires

  1. [Débutant] Problème Envoi/reception de donnee par socket
    Par Kisskool83 dans le forum VB.NET
    Réponses: 2
    Dernier message: 30/06/2011, 13h11
  2. Problème d'envoi et reception avec Outlook
    Par ALIAS200 dans le forum Outlook
    Réponses: 2
    Dernier message: 16/03/2009, 07h23
  3. Problème envoi/reception serveur client
    Par Sadz74 dans le forum C#
    Réponses: 3
    Dernier message: 15/02/2008, 19h13
  4. Problème d'envoie de text avec les sockets
    Par Coussati dans le forum Web & réseau
    Réponses: 6
    Dernier message: 16/09/2005, 10h26
  5. [HTML] Problème d'envoi de formulaire
    Par autumn319 dans le forum ASP
    Réponses: 26
    Dernier message: 03/09/2003, 10h06

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