begin process at 2012 05 30 12:25:24
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Réseau & Internet

 > 

Winsock pas fiable?? (fonction recv )


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Winsock pas fiable?? (fonction recv )

dimanche 25 novembre 2007 à 06:17:00 | Winsock pas fiable?? (fonction recv )

ssmint

Bonsoir à tous,
une fois de plus mon insomnie me pousse vers mon IDE pour une session de codage.. (Ou pour le coup c'est le code qui me rend insomniaque!)
Bref! Cette nuit il s'agit de problèmes de sockets, plus précisément winsock et l'envoie de fichier.

Jusqu'à maintenant pour envoyer un fichier, je me contentais de le bufferiser, puis de passer l'intégralité du buffer à la fonction send. A chaque fois c'était de petits fichiers (<100Ko). Mais cette fois je dois envoyer des fichiers allant de 200Ko à 100Mo. Mais bon je vais pas mettre 100Mo en RAM, jaimerais donc mettre la taille max du buffer d'envoie et de reception.
J'ai testé :
getsockopt(sock,SOL_SOCKET,SO_SNDBUF,(char*)&size, &s_int)
getsockopt(sock,SOL_SOCKET,SO_RCVBUF,(char*)&size, &s_int)

A chaque fois j'obtiens 96 768. Pas trop cohérent vu que il m'arrive de passer un buffer entier de 200Ko à la fonction send et ça fonctionne, bizarre...
Mais bon passons.
Je fais donc une petite boucle qui s'occupe de fractionner mon fichier et de l'envoyer, côté reception(client) ça donne ça :

// size = taille du fichier que l'on reçoie
// packetsize = taille de la fraction de fichier envoyé en une fois (en général 200Ko) 
// size%psize =  // reste de la division pour avoir un dernier packet de la taille de la fraction de fichier restant.
// tot sert à savoir combien d'octect son reçu grâce au retour de recv()
....

    for(int i=size/packetsize; i; i--) 
    {
        tot+=recv(sock,buf,packetsize,0);
        WriteFile(outfile,buf, packetsize,&relou, NULL);
    }
    if(size%packetsize) 
    {
        tot+=recv(sock,buf,size%packetsize,0);    
        WriteFile(outfile,buf, size%packetsize,&relou, NULL);
    }

Le tout fonction trés bien mais une fois sur 2 (surtout avec de gros fichiers) la variable tot est inférieur à size, par conséquent ( et j'ai vérifié) à certaines itérations de la boucle for, la fonction recv ne remplit le buffer que partiellement. Le WriteFile qui passe derriere recopie donc la fin du buffer de l'itération précédant. A la fin du traitement mon fichier est donc corrompu.

J'ai essayé ça avec des packetsize allant de 150 octect à 1,5Mo, toujours le même soucis, ça marche une fois de temps en temps.
J'aimerais donc savoir d'où vient le problème....

Autrement j'ai vu un flag intérressant sur MSDN pour la fonction recv :
MSG_WAITALL qui impose à la fonction d'attendre tant que le buffer n'est pas rempli mais quand je le met dans la fonction le compilo me dit que la constante n'existe pas!!!
Elle n'est pas dans winsock2.h..!


Voilà désolé pour la longeur du post..
Merci d'avance.

dimanche 25 novembre 2007 à 06:25:34 | Re : Winsock pas fiable?? (fonction recv )

ssmint

Je précise juste que tous les tests ont été effectué sur localhost...

mardi 4 décembre 2007 à 00:50:04 | Re : Winsock pas fiable?? (fonction recv )

nickydaquick

Membre Club
          Salut,

  le probleme avec les sockets et ton programme en fait est que le changement de la taille du buffer n'a rien avoir . C'est l'algorithme qu'il faut un tout petit peu modifier. Lorsque tu dois envoyer 200Ko par une socket , meme si la taille du buffer est 8192(8Ko) le message est deja envoye par paquets de 8Ko. Alors en essayant d'en renvoyer par send un autre gros paquet tu risques de solliciter la socket avant qu'elle ne soit prete a envoyer d'autres donnees.
   Alors je te conseille d'utiliser des sockets non-bloquantes avec un server Unithread, qui verifie l'etat de la socket grace a la fonction poll ou select , et les FD_SET.
  Dans ce cas tu seras capable de verifier lorsque la socket sera prete a envoyer des donnees , lorsqu'elle en aura recu, s'il y a des erreurs relatives ... bref capable d'agir au bon moment.

                  J'espere avoir aider, salut

je suis heureux de faire partie d'une grande famille ...!


Cette discussion est classée dans : fichier, fonction, size, recv, packetsize


Répondre à ce message

Sujets en rapport avec ce message

Remplacer la fonction de copie de fichier sous Windows [ par MangaII ] Salut !Quelqu'un sorai-t-il comment on pe remplacer la fonction de copie de fichier sous Windows par un programme maison !Mon but est d'optimiser la c lecture de fichier [ par Machuet ] Hello, j'ai plusieurs question concernant la manipulation de fichier. En effet venant de VB, j'aimerais savoir si il existe des fonction pour lire un Suprimmer un fichier [ par naney ] tout d'abort un grand merci au webmaster de ce site :D car j'en avais mare de cherche un site comme vbfranc.com mais qui parler du c et du c++Je cherc PROBLEME pour retourner un char* a partir d'un fichier [ par kobee12 ] Voici ma fonction. Elle prend en argument un caractere. A partir de ce caractere, elle renvoie la chaine qui lui est associe.Par exemple:"fichier_lang PROBLEME pour retourner un char* apres recuperation d'une chaine(sscanf) d'un fichier [ par kobee12 ] Voici ma fonction. Elle prend en argument un caractere. A partir de ce caractere, elle renvoie la chaine qui lui est associe.Par exemple:"fichier_lang Utiliser un plugin (en dll) [ par CyberP ] Comment utiliser un plugin ? Le charger et utiliser les fonctions qui sont à l'intérieur ?Je compile un fichier en dll avec une fonction "dire_bonjour Fonction "Remplacer Tout" pour un fichier (VC++.Net) [ par milobac ] J'aimerais créer un programme, en VC++.Net, qui remplace une chaîne, à chaque fois qu'elle est détecté dans un fichier, par une autre.En quelque sorte Creer ses propres fonctions [ par CHENRY ] En VC++6, avec les MFC, je voudrais ajouter à mon projet un fichier de fonctions et procédures personnelles. J'ai créé un fichier d'en-tete contenant Nombres dans fichier .txt [ par Franckyom50 ] Salut à tous !J'aimerais savoir comment je peux récupérer une série de nombres qui se trouvent dans un fichier texte, sous cette forme :365221655236-2 Fonction audiowave [ par laurielle ] j'aimerais utiliser PlaySound("fichier.wav", NULL, SND_FILENAME) pour lire un fichier wave, j'inclus bien windows.h et j'ai bien aussi winmm.lib, mais


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,200 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales