Fiabiliser transfert par socket

Fiabiliser transfert par socket - C++ - Programmation

Marsh Posté le 30-01-2005 à 18:18:14    

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. }

Reply

Marsh Posté le 30-01-2005 à 18:18:14   

Reply

Marsh Posté le 30-01-2005 à 18:41:51    

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

Reply

Marsh Posté le 30-01-2005 à 18:52:16    

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
Reply

Marsh Posté le 30-01-2005 à 19:38:47    

/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.

Reply

Marsh Posté le 30-01-2005 à 19:48:25    

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

Reply

Marsh Posté le 30-01-2005 à 19:58:26    

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

Reply

Marsh Posté le 30-01-2005 à 20:20:05    

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.

Reply

Marsh Posté le 30-01-2005 à 20:21:18    

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

Reply

Marsh Posté le 30-01-2005 à 20:26:38    

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 !!
 

Reply

Marsh Posté le 30-01-2005 à 20:35:07    

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.

Reply

Marsh Posté le 30-01-2005 à 20:35:07   

Reply

Marsh Posté le 30-01-2005 à 20:40:42    

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.

Reply

Marsh Posté le 30-01-2005 à 20:45:30    

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
Reply

Marsh Posté le 30-01-2005 à 20:56:17    

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
Reply

Marsh Posté le 30-01-2005 à 21:05:11    

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.

Reply

Marsh Posté le 30-01-2005 à 21:46:42    

K merci ++

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed