Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2702 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Fiabiliser transfert par socket

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Fiabiliser transfert par socket

n°966168
masseur
Posté le 30-01-2005 à 18:18:14  profilanswer
 

Salut.
Je vais vous expliquer mon petit problème.
Je crée un client et un serveur.
Des que le serveur recoit une demande il envoie un fichier en utilisant un thread vers le client.
Seulement quand je teste sur mon PC tout se passe bien.
 
Dès que je teste les deux programmes sur deux ordis différents du réseau le client recoit le fichier mais l'image est toute décalée (elle ressemble plus à rien).
Pourquoi un tel phénomène quand on test sur le réseau et le net?
 
Comment y remédier.  
 

Code :
  1. char buffer[512];
  2. struct sockaddr_in sin;
  3. int i, r;
  4. int size = sizeof(struct sockaddr_in);
  5. sin.sin_family = AF_INET;
  6. sin.sin_port = htons(50);
  7. sin.sin_addr.s_addr = inet_addr("127.0.0.1" );
  8. if(WSAStartup(0x101, &w) == 0)
  9.    {
  10.     if((sock_client = socket(AF_INET, SOCK_STREAM, 0)) != INVALID_SOCKET)
  11.       {
  12.        if(connect(sock_client, (struct sockaddr *)&sin, size) == 0)
  13.          {
  14.           //création fichier sur le disque
  15.            fichier=fopen("1.bmp","w+b" );
  16.     if(fichier == NULL)
  17.     {
  18.      
  19.         exit(1);
  20.     }
  21.      
  22.            //recevoir taille
  23.            recv(sock_client,(char *)&taille,sizeof(taille),0); 
  24.            //tant que taille>taille_buf
  25.            temp=taille;
  26.           while(temp>TAILLE_BUF)
  27.           {
  28.            //recoit partie fichier
  29.             recv(sock_client,transfert, TAILLE_BUF, 0);
  30.             //on ecrit le contenu dans le fichier
  31.              fwrite(transfert,1, TAILLE_BUF, fichier);
  32.             temp=temp-TAILLE_BUF;
  33.           }
  34.    
  35.            recv(sock_client, transfert, temp, 0);
  36.            fwrite(transfert,1, TAILLE_BUF, fichier);
  37.            fclose (fichier);
  38.           closesocket (sock_client);
  39.          
  40.          }
  41.        else MessageBox(0, "Erreur connexion  Serveur !", NULL, MB_ICONERROR);
  42.       }
  43.     else MessageBox(0, "Erreur  création Socket Client !", NULL, MB_ICONERROR);
  44.    }
  45. else MessageBox(0, "erreur WSAStartup() !", NULL, MB_ICONERROR);
  46. }

mood
Publicité
Posté le 30-01-2005 à 18:18:14  profilanswer
 

n°966194
Taz
bisounours-codeur
Posté le 30-01-2005 à 18:41:51  profilanswer
 

c'est toi qui te vautre. Il y a des vérifications d'erreurs dans toute la pile réseau.
 
Juste comme ça tu ferais bien de lire la documentation de recv ... tu foires complètement le cas limite. Résultat, comme les BMP sont codés à l'envers (premier pixel -> derniers octets du fichier) et ben tu fous tout en l'air.
 
En clair : RTFM

n°966212
masseur
Posté le 30-01-2005 à 18:52:16  profilanswer
 

Taz a écrit :

c'est toi qui te vautre. Il y a des vérifications d'erreurs dans toute la pile réseau.
 
Juste comme ça tu ferais bien de lire la documentation de recv ... tu foires complètement le cas limite. Résultat, comme les BMP sont codés à l'envers (premier pixel -> derniers octets du fichier) et ben tu fous tout en l'air.
 
En clair : RTFM


 
Que signifie RTFM lol.
Mais si comme tu le dis que les BMP sont codés à l'envers (je suis d'accord) pourquoi quand je teste le serveur et le client sur mon PC cela marche?
De toute facon l'image n'arrive meme pas à l'envers mais completement en vrac.
 
Quand tu dis "tu foires complètement le cas limite" pourrais tu expliciter au lieu de rester vague s'il te plait.
 
Merci de ton aide.


Message édité par masseur le 30-01-2005 à 18:58:51
n°966252
Taz
bisounours-codeur
Posté le 30-01-2005 à 19:38:47  profilanswer
 

/me se tappe contre la tête contre le mur ...
 
Ça m'apprendra à donner des explications
 
allez, lis la documentation de recv et ne reviens pas avant.

n°966256
masseur
Posté le 30-01-2005 à 19:48:25  profilanswer
 

Sans vouloir être indélicat tu crois que je viendrais poser une question sans avoir lu la doc?
 
Donc bon ce genre de réponse ne font pas avancer le chmilblick

n°966271
Taz
bisounours-codeur
Posté le 30-01-2005 à 19:58:26  profilanswer
 

non t'as pas lu la doc
 
sinon t'écrirais pas ça
 
#             recv(sock_client,transfert, TAILLE_BUF, 0);
#             //on ecrit le contenu dans le fichier
#              fwrite(transfert,1, TAILLE_BUF, fichier);
 
 
alors fais pas comme si c'était moi l'idiot

n°966293
masseur
Posté le 30-01-2005 à 20:20:05  profilanswer
 

J'ai résolu mon problème.
Enfin ca marche mais ce genre de réponses qui tournent autours du pot ne font rien avancer.
Voila a bon entendeur salut.

n°966294
Taz
bisounours-codeur
Posté le 30-01-2005 à 20:21:18  profilanswer
 

donc t'as pas lu la documentation de recv ...

n°966298
masseur
Posté le 30-01-2005 à 20:26:38  profilanswer
 

Taz a écrit :

donc t'as pas lu la documentation de recv ...


 
Le problème ne venait pas du recv.
J'ai tapé ca.
 

Code :
  1. octetsRecus = recv(sock_client,transfert, TAILLE_BUF, 0);
  2. if ((octetsRecus>0))
  3.               {
  4.             fwrite(transfert,1, octetsRecus, fichier);
  5.             temp=temp-octetsRecus;
  6.              }


 
Sinon bravo pour l'histoire de l'ordre des pixels etc qui était hors sujet !!
 

n°966304
Taz
bisounours-codeur
Posté le 30-01-2005 à 20:35:07  profilanswer
 

là je reste sans voix.
 
Comme par hasard en utilisant correctement recv, ça marche. Et tu oses dire que que le problème n'avait pas de rapport de recv ...
 
Maintenant, quand 'octetsRecus < TAILLE_BUF', ce qui est le cas lors du dernier transfert, devine ce qu'il y as dans 'transfert' ... les octetsRecus premiers bytes sont bons, le reste, c'est des déchets. Et toi tu écris ces déchets. Résultat le BMP reconstitué a plus de pixel que prévu (TAILLE_BUF - octetsRecus) et les déchets que tu as récupéré constitue les premiers pixels de ton image et foute le bronx.
 
 
Alors la prochaine fois tu seras sympa de :
- faire ce qu'on te dit. Si je te dis de regarder l'emploi de recv, c'est pas pour te faire chier
- faire marcher ta boîte à cerveau avant de dire plus bêtises.
 
Mais tout compte fait, y aura pas de prochaine fois. Y a des fois je m'en veux vraiment de filer un coup de main.

mood
Publicité
Posté le 30-01-2005 à 20:35:07  profilanswer
 

n°966310
masseur
Posté le 30-01-2005 à 20:40:42  profilanswer
 

Pour etre bref je te reproche rien.
Mais si tu viens m'aider soit concret et pas répondre va voir la documentation car cette réponse je sait la trouver seule.
C'est tout ce que je te repoche.
Car tu me donnais des réponses sans vraiment en donner.
Sur ce sans rancune.

n°966316
Taz
bisounours-codeur
Posté le 30-01-2005 à 20:45:30  profilanswer
 

Désolé, mais avec un niveau CP, tu vois un prototype
 
int recv(int s, void *buf, int len, unsigned int flags);
 
qu'est-ce que tu fais ? et bien tu regardes à quoi servent les paramètres et ce que renvoie la fonction.
 
VALEUR RENVOYÉE
       Ces fonctions renvoient le nombre d’octets reçus si elles  réussissent, ou -1 si elles échouent, auquel cas errno contient le code d’erreur.

 
Je vois pas quoi rajouté. Donc la documentation tu l'as pas trouvée. Ou tu l'as pas lu. C'est pas la peine de dire que j'ai pas été assez concret : j'allais pas non plus te coller la documentation :o


Message édité par Taz le 30-01-2005 à 20:45:57
n°966333
masseur
Posté le 30-01-2005 à 20:56:17  profilanswer
 

Tu m'aurais juste dit fait gaffe à ce que renvoie la fonction et c'etait réglé.
Elle ne renvoie pas toujours la taille de ton buffer et voila c'etait réglé.
reponse bref rapide et conrète.
Voila sur ce le débas est clos.
Désolé de ne pas avoir un niveau de CP.
Melon style ++ et merci quand même


Message édité par masseur le 30-01-2005 à 20:59:07
n°966341
Taz
bisounours-codeur
Posté le 30-01-2005 à 21:05:11  profilanswer
 

Pourquoi je t'ai renvoyé vers l'intégralité de la documentation ? Pour pas que ce genre d'erreur se reproduise :  tu es toi même passé à fond sur la documentation (mais alors vraiment), tu peux pas me reprocher de pas te donner une bribe de doc, alors que c'est exactement ce qui t'as amené à te planter.

n°966372
masseur
Posté le 30-01-2005 à 21:46:42  profilanswer
 

K merci ++


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Fiabiliser transfert par socket

 

Sujets relatifs
optimisation de la recuperationd'image Rgb par socket[C#] Connexion par socket en mode Asynchrone (server)
Probleme socketSocket : fixer un timeout
Socket: connaître l'adresse ip du client qui se connect à un serveurtransfert massif
[JAVA] Plus haut niveau que les socketTransfert de fichiers pages perso chez le 9
Transfert d'images via un socket ? 
Plus de sujets relatifs à : Fiabiliser transfert par socket


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR