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 :

Multiple envoie socket


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 Multiple envoie socket
    Eu...c'est encore moi, je vais me faire taper à force
    Mais bon, ça peut en aider d'autre aussi hein...hein?

    Bon voila, j'ai 2 prog, un client et un serveur (jusque là tout est normal), le client se connecte au serveur et lui envoi un premier message avec le md5 du fichier qui'il va envoyer par la suite, le serveur enregistre ce md5 en memoire, effectue un traitement avec et renvoi une réponse, le client doit renvoyer un autre message jusqu'à lui envoyer le message "END" pour terminer la transmission. Le problème c'est que j'ai ce code mais ça ne vas pas... et je ne pense pas qu'il faille se deconnecter à chaque fois puis se reconnecter, j'ouvre ma connexion avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(sock, (SOCKADDR *)&sin, sizeof(sin));
    puis je peux envoyer autant de truc que je veux non?

    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
    bool verifMd5(string md5File, string addIp, int port, string ucName) {
        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(), (int)strlen(ucName.c_str()), 0);
    //pour gerer le retour du serveur je penser faire ici un recv(csock, recvbuf, recvbuflen, 0); ... je pense que ça devrait aller
        system("PAUSE");
        send(sock, md5File.c_str(), (int)strlen(md5File.c_str()), 0);
        closesocket(sock);
        WSACleanup();
    }
    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
    int main(void) {
        int port = 1563;
        char *nameFile;
     
        char recvbuf[DEFAULT_BUFLEN] = "";
        int recvbuflen = DEFAULT_BUFLEN;
     
        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) {
            do { //ça va pas du tout ça car en bouclant comme ça il m'affiche ne console tout le temps le premier envoi effectuer avec le client...en boucle...
            recv(csock, recvbuf, recvbuflen, 0);
            cout << recvbuf << endl;
            closesocket(sock);
            WSACleanup();
            } while (recvbuf != "END");
        }
     
        system("PAUSE");
    	return 0;
    }
    Voili voilou...
    Ha si, aussi, je voulais essayer de voir pour une gestion de timeout, genre le client arrive à se connecter au serveur, envoi le premier message mais la réponse met trop de temps à arriver... pareil coté serveur... Si vous avez des idées...

    Merci à tous !

    Mais si, mais si... un jour, quand je posterais, ce sera un code fini, propre, commenté et tout pour aider les gens et pas pour leur faire fondre le cerveau... Mais si, mais si...

  2. #2
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Salut,

    et il est ou le probleme ?

    Tu veux savoir s il faut deconnecter a chaque emission ?
    non, tu conserves ta socket tant que tu comptes communiquer avec.
    Par contre ca a l air d'etre en mode bloquant (le process s'arrete tant que recv ne recoit rien).

    De plus tit commentaire constructif :
    - lors de ton send( maString.c_str() ) pas sur que l envoi soit direct, pas de marqueur de fin de chaine, j'ai peur que ce soit bufferisé.

  3. #3
    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
    Citation Envoyé par Verbalinsurection Voir le message
    le client se connecte au serveur et lui envoi un premier message avec le md5 du fichier qui'il va envoyer par la suite
    Tu dis qu'il envoie d'abord le MD5 puis ensuite le fichier

    Si je regarde le code du client, il envoie d'abord le fichier et en second le MD5

    Si je regarde le code du client, je ne voie jamais l'envoie de la balise "END"

    C'est pas très grave, mais strlen(ucName.c_str()), c'est pas très joli et encore moins efficace. ucName.length() est nettement mieux.

    Si je regarde le code du serveur, le programme boucle tant que la balise "END" n'est pas reçue.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while (recvbuf != "END");
    Ce code ne marchera jamais car dans ce cas, tu regarde si l'adresse de ton buffer de reception (recvbuf) est égal au pointeur "END". Cela ne sera jamais vrai. Le bon test c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while (memcmp(recvbuf, "END", strlen("END") != 0);
    Je ne voie pas dans ton code comment le serveur sais qu'il a finit de lire le fichier qu'il va lire le MD5

    Dans le code du serveur, la fermeture des socket (d'ailleurs, tu oublies de fermer le socket client) et le WSACleanup() se font à l'issue de la réception du "END" et pas dans la boucle do...while

    Il y a encore du travail !!

    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
    .

  4. #4
    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
    Et oui, il y a encore du travail, mais je suis là pour ça

    Merci en tout cas pour vos conseils je m'y met de suite !

  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
    Ok, alors en cette belle journée de froid (2° !!!!!!) j'ai repris mon code, alors :
    J'ai bien fait les modifs que tu m'as donné ram_0000, alors voila mon nouveau code :
    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
    bool verifMd5(string md5File, string addIp, int port, string ucName) {
        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);
    string end = "END";
        connect(sock, (SOCKADDR *)&sin, sizeof(sin));
    system("PAUSE");
        send(sock, ucName.c_str(), ucName.length(), 0);
    system("PAUSE");
        send(sock, md5File.c_str(), md5File.length(), 0);
    system("PAUSE");
        send(sock, end.c_str(), end.length(), 0);
     
        closesocket(sock);
        WSACleanup();
    }
    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
    int main(void) {
        int port = 1563;
        char *nameFile;
     
        char recvbuf[DEFAULT_BUFLEN] = "";
        int recvbuflen = DEFAULT_BUFLEN;
     
        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) {
            do {
                recv(csock, recvbuf, recvbuflen, 0);
                cout << recvbuf << endl;
            } while (memcmp(recvbuf, "END", strlen("END")) != 0);
            closesocket(sock);
            WSACleanup();
        }
     
        //attenteFichier(port, nameFile);
        system("PAUSE");
    	return 0;
    }
    Bon alors, mon cas s'arrange, voila ce que j'obtiens sur la console coté serveur :
    THOMAS
    e326ff28edaf71e2c1246a6cae0750e8
    END6ff28edaf71e2c1246a6cae0750e8
    Comme vous pouvez le voir, je peux bien envoyé plusieur pacquet sans problème mais comme vous pouvez le voir aussi, quad j'envoi mon END il me remet le md5 derrière...Mais euuu!!!!
    Une ptite idée?

    edit : Ha et puis, comme c'est du tcp, je dois pouvoir envoyer une réponse à partir du serveur, mais comment....?

  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
    Citation Envoyé par Verbalinsurection Voir le message
    Ok, alors en cette belle journée de froid (2° !!!!!!) j'ai repris mon code, alors :
    J'ai bien fait les modifs que tu m'as donné ram_0000, alors voila mon nouveau code :
    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
    bool verifMd5(string md5File, string addIp, int port, string ucName) {
        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);
    string end = "END";
        connect(sock, (SOCKADDR *)&sin, sizeof(sin));
    system("PAUSE");
        send(sock, ucName.c_str(), ucName.length(), 0);
    system("PAUSE");
        send(sock, md5File.c_str(), md5File.length(), 0);
    system("PAUSE");
        send(sock, end.c_str(), end.length(), 0);
     
        closesocket(sock);
        WSACleanup();
    }
    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
    int main(void) {
        int port = 1563;
        char *nameFile;
     
        char recvbuf[DEFAULT_BUFLEN] = "";
        int recvbuflen = DEFAULT_BUFLEN;
     
        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) {
            do {
                recv(csock, recvbuf, recvbuflen, 0);
                cout << recvbuf << endl;
            } while (memcmp(recvbuf, "END", strlen("END")) != 0);
            closesocket(sock);
            WSACleanup();
        }
     
        //attenteFichier(port, nameFile);
        system("PAUSE");
    	return 0;
    }
    Bon alors, mon cas s'arrange, voila ce que j'obtiens sur la console coté serveur :

    Comme vous pouvez le voir, je peux bien envoyé plusieur pacquet sans problème mais comme vous pouvez le voir aussi, quad j'envoi mon END il me remet le md5 derrière...Mais euuu!!!!
    Une ptite idée?

    edit : Ha et puis, comme c'est du tcp, je dois pouvoir envoyer une réponse à partir du serveur, mais comment....?
    Non, il ne remet pas le MD5 derrière, ton problème est coté serveur. tu ne termine pas ta string pour de l'affichage après la réception

    Normallement, la fonction recv() te dis combien d'octets tu as recu
    to code devrait ressemble à quelquechose comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       int nb_recv = recv(csock, recvbuf, recvbuflen, 0);
       if(nb_recv != -1)
       {
          recvbuf[nb_recv] = 0;
       }
       else
       {
          /* erreur de reception */
          ...
       }
    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
    .

  7. #7
    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, et pour pouvoir envoyer une réponse ?
    Je sais pas, peut etre esce une betise mais en vb quand on reçoit un paquet tcp on peut renvoyer direct une réponse sans devoir remettre adresse ip etc...
    C'est possible en c++?

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

Discussions similaires

  1. [MySQL] Multiple envoie vide avec formulaire en php
    Par Aiglichon dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 07/03/2013, 13h37
  2. envoi socket avec parametre ip
    Par motivée dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 02/02/2009, 08h06
  3. connexions multiples à un socket
    Par Mindiell dans le forum Développement
    Réponses: 4
    Dernier message: 04/08/2008, 07h33
  4. [toFAQ][socket] Envoi d'une structure
    Par julien20vt dans le forum C++
    Réponses: 15
    Dernier message: 23/04/2003, 15h47
  5. [Socket]envoie de fichier!!!
    Par SamDaKap dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/11/2002, 08h07

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