2012-04-27 5 views
2

Lorsque mon client envoie un fichier au serveur, devrais-je Dormir (100) environ avant d'envoyer le bloc suivant pour m'assurer que le serveur dispose de suffisamment de temps pour télécharger + écrire les données?Transfert de fichier C++

Est-ce que cela semble complètement inutile?

De plus, j'obtiens des erreurs de type wouldblock (# 10035) lors de l'envoi d'un bloc, donc im juste en boucle d'envoi jusqu'à ce qu'il réussisse, si send == SOCKET_ERROR goto SendAgain; , c'est bon?

+3

Si tout ce que vous faites avec l'erreur de bloc est mise en boucle, pourquoi vous utilisez un socket bloquantes en premier lieu? – Sven

+0

Lire le dernier commentaire à propos de Select – user1348950

+0

Si le socket n'est pas en mode non bloquant, alors 'send' ne devrait pas renvoyer une erreur wouldblock, il devrait bloquer dans ce scénario. – Sven

Répondre

2

Si vous envoyez votre fichier via TCP, alors c'est le protocole qui assure que tout a été reçu, je ne voudrais pas mettre de sommeil entre chaque morceau. L'erreur wouldblock est soit que vous envoyez trop de données pour votre tampon de sortie, soit que vous essayez de l'envoyer trop rapidement et que le tampon distant soit plein. Cela semble correct de le renvoyer parce que le récepteur l'a reçu mais n'avait pas assez d'espace pour le stocker et l'a juste laissé tomber.

Voici un petit article sur votre erreur: Winsock error 10035

+0

Donc, si c'est la raison, en boucle l'envoi fonctionne bien non? Comment se fait localement tout va bien, mais à distance, il semble que je vais laisser tomber quelques données quelque part – user1348950

+0

si le tampon est plein et certaines données sont abandonnées, vous pouvez ne pas recevoir les données dans le bon ordre. Vous pouvez ajouter une somme de contrôle (SHA-1/MD5/...) de votre fichier que vous envoyez avant d'envoyer le fichier réel. À la fin, vous pouvez être sûr d'avoir reçu le bon fichier entier. – Uflex

+0

Je sais que je perds des données parce que la taille du fichier est beaucoup plus petite, l'icône n'est pas là, le fichier ne s'ouvre pas, etc. Comment puis-je empêcher les données d'être supprimées? – user1348950

2

À mon avis en utilisant sleepfunction d'attendre quelque chose à faire est dans 99% du temps dans le mauvais sens. Vous n'aurez jamais besoin du temps dont vous avez besoin pour exécuter un processus (peut être interrompu par des pics, d'autres problèmes d'E/S, etc.)

Si vous voulez vous assurer que quelque chose d'important est exécuté complètement, vous devriez lire sur les sémaphores ou quelque chose comme ça, où vous verrouiller/libérer les processus au début/fin.

+0

Je vais regarder dans ça, j'ai voulu chercher une alternative au sommeil, merci. – user1348950

+0

Vous êtes les bienvenus. Si vous voulez en savoir plus sur ce type de traitement, le sujet de l'élimination des priorités devrait susciter votre intérêt. –

0

Pris d'un man-page:

When the message does not fit into the send buffer of the socket, send() normally blocks, unless the socket has been placed in nonblocking I/O mode. In nonblocking mode it would fail with the error EAGAIN or EWOULDBLOCK in this case. The select(2) call may be used to determine when it is possible to send more data.