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

Réseau C Discussion :

screenshot client serveur


Sujet :

Réseau C

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 151
    Points : 49
    Points
    49
    Par défaut screenshot client serveur
    Bonjour,

    j'ai réaliser deux programmes en C, un dit client et l'autre dit serveur.
    Le client se connecte a un serveur et des que la connection est établie, un screenshot de l'écran du poste serveur est effectuer en enregistrer sur le C: de celui-ci. Je souhaiterais envoyer cette image sur le poste client, via un buffer surement mais je ne voit pas comment, pourriez vous m'aider???

  2. #2
    Membre du Club Avatar de Stevie Wonder
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Points : 55
    Points
    55
    Par défaut
    La methode consisterait a faire une partie de ping pong entre le client et le serveur.
    1. Determiner la taille de ton screenshot
    2. Envoyer la taille (obligatoire) ainsi que le nom (facultatif) au client
    3. Ouvrir ton screenshot et le lire en mode binaire ("rb")
    4. Ouvrir un fichier depuis le client pour receptionner les paquets
    5. Envoyer paquet (d'une taille x definie par ton buffer) par paquet les données a ton client
    6. Ecrire sur le fichier (en prenant garde aux caracteres non imprimables)
    7. Fermer les 2 fichiers

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    coter serveur ca me donne ca:

    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
           bmp = fopen(buffer, "rb");
     
                    fseek(bmp, 0, SEEK_END);
                    int taillei = ftell(bmp);
                    fseek(bmp, 0, SEEK_SET);
                    itoa(taillei, (char *)buf, 10);
                    send(new_sock, buf, strlen(buf), 0);
                    recv(new_sock, buf, sizeof(buf), 0);
     
                    long size = _filelength(bmp);
     
    	ltoa(size,buf,20) ;
    	send(new_sock,buf,strlen(buf),0) ;
    	while(size > 0)
    	{
    		read(bmp,buf,256) ;
    		send(new_sock,buf,strlen(buf),0) ;
    		size = size - 256 ; 
    		memset(buf,0,256) ;
    	}
    et coter client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    long size;
              size = atol(buf) ;
     
    	while(size > 0)
    	{
    		recv(csock,buf,256,0) ;
    		write(bmp,buf,strlen(buf)) ;
    		size = size - 256 ;
    		memset(buf,0,256) ;

  4. #4
    Membre du Club Avatar de Stevie Wonder
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Points : 55
    Points
    55
    Par défaut
    read(bmp,buf,256) ;
    send(new_sock,buf,strlen(buf),0) ;
    Mauvaise idée ca, strlen s'arrete au caractere '\0'. Si ta chaine (et c'est bien probable) en contient, tu auras une taille erronée.
    Pour la lecture, ecriture utilise jte conseil la famille des fopen() , fread(), fwrite() pour commencer et trouve un moyen de remplacer ton strlen();

  5. #5
    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 Stevie Wonder
    Mauvaise idée ca, strlen s'arrete au caractere '\0'. Si ta chaine (et c'est bien probable) en contient, tu auras une taille erronée. Utilise plutot la famille des fopen() , fread(), fwrite() pour commencer et trouve un moyen de remplacer ton strlen();
    T'arrête de raconter n'importe quoi ? Il s'agit de sockets ici.
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Membre du Club Avatar de Stevie Wonder
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Points : 55
    Points
    55
    Par défaut
    Et alors ? En 2nde partie je parle de son read. C'est ptete pas clair. Stop etre aggressif. Si t'avais lu le message depuis le debut, jlui donne un debut de piste.

  7. #7
    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 Stevie Wonder
    Et alors ? En 2nde partie je parle de son read. C'est ptete pas clair. Stop etre aggressif. Si t'avais lu le message depuis le debut, jlui donne un debut de piste.
    En plus, je ne vois pas le problème avec strlen(). Visiblement, c'est une transmission de type longueur, données. (en admettant que le format de la longueur soit portable).
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre du Club Avatar de Stevie Wonder
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Points : 55
    Points
    55
    Par défaut
    si il y a '\0' au milieu de son "buf" c'est pas un probleme ?

  9. #9
    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 518
    Points
    41 518
    Par défaut
    Tu dois être fatigué aujourd'hui, emmanuel : S.W. met le doigt sur le fait que gy0m76 utilise strlen() sur des données binaires qui peuvent être n'importe quoi sauf des chaînes.

    De plus, gy0m76 utilise effectivement un read() sur un FILE*, ô infâmie.
    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.

  10. #10
    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 Stevie Wonder
    si il y a '\0' au milieu de son "buf" c'est pas un probleme ?
    Si c'est une chaine, y'a pas de 0. Ou alors ce n'est pas une chaine et alors oui, il fait compter les bytes et ne pas utiliser strlen(). OK.
    J'ai vu strlen(), j'ai pensé chaine. Erreur.
    Pas de Wi-Fi à la maison : CPL

  11. #11
    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 Médinoc
    Tu dois être fatigué aujourd'hui, emmanuel : S.W. met le doigt sur le fait que gy0m76 utilise strlen() sur des données binaires qui peuvent être n'importe quoi sauf des chaînes.

    De plus, gy0m76 utilise effectivement un read() sur un FILE*, ô infâmie.
    OK. Vu. J'avais pas percuté sur le fait que les données étaient binaire.
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    merci pour tte vos réponse, juste une precision a apporté, ce n'est pas une chaine de caractère que je transmet mais une image (enfin je c'est pas si ca change quelque chose)

  13. #13
    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 gy0m76
    merci pour tte vos réponse, juste une precision a apporté, ce n'est pas une chaine de caractère que je transmet mais une image (enfin je c'est pas si ca change quelque chose)
    Si, ça change tout. Effectivement, strlen() n'a aucun sens. Il faut compter les bytes...
    Pas de Wi-Fi à la maison : CPL

  14. #14
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    j'arrive a cela maintenant:

    client

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    long size;
         send(sock, "begin", 7, 0);
         recv(sock, buf, sizeof(buf), 0);
         size = atol(buf) ;
         fopen ("src.jpg", "w");
    	     // reception des donnees
    	while(size > 0)
    	{
    		recv(sock,buf,256,0) ;  //reception des donnees
    		write(bmp,buf,strlen(buf)) ; //ecriture du buffer
    		size = size - 256 ;
    		memset(buf,0,256) ;
    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
    fseek(bmp, 0, SEEK_END);
                    int size = ftell(bmp);
                    fseek(bmp, 0, SEEK_SET);
                    itoa(size, (char *)buf, 10);
                    send(new_sock, buf, sizeof(size), 0);
    				if (strstr(buf, "DECO") != 0)
    				{
                            break;
                    }
     
        bmp = fopen(buffer, "rb");
     
    	while(size > 0)
    	{
    		read(bmp,buf,256) ; //lecture
    		send(new_sock,buf,strlen(buf),0) ; // envoie de buffer
    		size = size - 256 ; 
    		memset(buf,0,256) ;
    	}
    Apparement mon pb vient des 2 boucles while, car jusque la, il me crée bien le screenshot sur le poste serveur, créer le fichier src.jpg coté client (mais celui-ci est vide 0ko) et le programme s'arrete.

  15. #15
    Membre du Club Avatar de Stevie Wonder
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par gy0m76
    read(bmp,buf,256) ; //lecture
    tu ouvres avec fopen(), qui te renvois un descripteur de type FILE*. read() et write() ont besoin d'un descripteur de fichier de type int! Or la tu leurs passes en parametre tes FILE*.

    Citation Envoyé par Stevie Wonder
    Utilise plutot la famille des fopen() , fread(), fwrite() pour commencer
    D'ailleurs t'as pas d'erreurs de compilation avec ca ? ou au moins un ptit warning

  16. #16
    Membre du Club Avatar de Stevie Wonder
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par gy0m76
    recv(sock,buf,256,0) ; //reception des donnees
    write(bmp,buf,strlen(buf)) ; //ecriture du buffer
    /*ndrl: RAAAAH*/
    read(bmp,buf,256) ; //lecture
    send(new_sock,buf,strlen(buf),0) ; // envoie de buffer
    /*ndrl: RAAAAH encore*/
    IL EST TRES POSSIBLE QUE TON "BUF" CONTIENNE UN '\0'!!! MAN STRLEN(). (je ne cris pas :p c'est pour que ca sois plus lisible)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #define LG_MAX 256
    int    rv;
     
    rv = recv(sock, buf, LG_MAX, 0) ;  //reception des donnees
    fwrite(buf, 1, rv, bmp) ; //ecriture du buffer
    /* et */
    fread(buf, 1, LG_MAX, bmp);
    send(new_sock, buf, LG_MAX, 0);
    Essai peut etre ca.

  17. #17
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    j'ai essayer mais sans succes malheuresement

  18. #18
    Membre du Club Avatar de Stevie Wonder
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Points : 55
    Points
    55
    Par défaut
    Dans ton code je ne vois pas de fclose(). Autre points dangereux, tu lis un nombre d'elements fixe de 256, mais tu te bases sur la longueur de ton fichier... imagine qu'il reste 3 elements dans ton fichier et que toi, tu en lis 256...
    Citation Envoyé par "Presentateur de France2
    Et là, c'est le drame !
    Vu que tu ne recuperes pas le nombre d'octets lus par (f)read().

  19. #19
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    ah tu a raison je n'avait pas mit de fclose pour le jpg, maintenant, le fichier jpg fait 2ko, il est tout gris avec des couleurs bizares en haut a gauche

  20. #20
    Membre du Club Avatar de Stevie Wonder
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Points : 55
    Points
    55
    Par défaut
    ca progresse
    Verifies ce que tu transmet/receptionnes et sois sur du nombre d'elements que tu ecris.

Discussions similaires

  1. Web contre client/serveur que choisir??
    Par silvermoon dans le forum Débats sur le développement - Le Best Of
    Réponses: 41
    Dernier message: 24/01/2004, 16h53
  2. Quel outil pour du développement Client/Serveur (Win XP) ?
    Par jey_bonnet dans le forum Débats sur le développement - Le Best Of
    Réponses: 5
    Dernier message: 02/11/2002, 15h57
  3. Réponses: 2
    Dernier message: 01/10/2002, 13h25
  4. comment gerer plusieurs connexions client/serveur
    Par naili dans le forum C++Builder
    Réponses: 3
    Dernier message: 14/08/2002, 17h58
  5. Langage le mieux adapté pour application client serveur ?
    Par guenus dans le forum Débats sur le développement - Le Best Of
    Réponses: 4
    Dernier message: 17/06/2002, 16h46

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