Accueil > Forum > > > > Winsock pas fiable?? (fonction recv )
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
|
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
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|