2009-11-23 3 views
0

Y at-il une bonne méthode sur la façon de transférer un fichier de dire ... un client à un serveur? probablement des images, mais mon professeur demandait pour tout type de fichiers.Question sur le transfert de fichiers pour la programmation socket

Je l'ai regardé autour et je suis un peu confus quant à l'idée générale. Donc, si nous avons un gros fichier, nous pouvons diviser ce fichier en segments ...? Puis envoyez chaque segment au serveur. Dois-je également utiliser une boucle while pour recevoir tous les fichiers/segments côté serveur? De plus, comment mon serveur saura-t-il si tous les segments ont été reçus sans savoir auparavant combien de segments il y a?

que je recherchais sur le site Cplusplus et a trouvé qu'il ya comme un transfert binaire des fichiers ...

Merci pour toute l'aide =)

Répondre

2

Si vous utilisez TCP:

Vous avez raison, il n'y a aucun moyen de « savoir » la quantité de données que vous allez recevoir. Cela vous donne quelques options:

1) Avant de transmettre les données d'image, envoyez d'abord le nombre d'octets à attendre. Ainsi, vos 4 premiers octets pourraient être l'entier de 4 octets "4096". Ensuite, votre client peut lire les 4 premiers octets, « savoir » qu'il attend 4096 octets, puis malloc(4096) il peut donc espérer que le reste. Ensuite, votre serveur peut envoyer() 4096 octets de données d'image. Dans ce cas, sachez que vous devrez peut-être recv() plusieurs fois - pour une raison ou pour une autre, vous n'avez peut-être pas reçu tous les 4096 octets. Vous devrez donc vérifier pour vous assurer que vous avez obtenu tout la valeur de retour de recv().

2) Si vous envoyez un seul fichier, vous pouvez simplement le faire lire par votre récepteur. Et il peut garder recv() depuis le socket jusqu'à ce que le serveur ferme la connexion. Ceci est un peu plus difficile - vous devez garder une trace de combien vous avez reçu, et si votre mémoire est pleine, vous devrez réattribuer. Je ne recommande pas cette méthode, mais techniquement accomplir la tâche.

Si vous utilisez UDP:

Cela signifie que vous ne disposez pas d'un transfert fiable. Donc, les paquets peuvent être supprimés. Ils pourraient aussi arriver hors service. Donc, si vous allez utiliser UDP, vous devez fragmenter vos données en petits segments. L'expéditeur et le destinataire doivent avoir un accord sur la taille d'un segment (100 octets? 1000 octets?)

De plus, vous devez également transmettre un numéro de séquence avec chaque paquet, c'est-à-dire étiqueter chaque paquet # 1 , # 2, etc. Parce que votre client doit être capable de dire: si des paquets sont manquants (vous recevez les paquets 1, 2 et 4 - et manquent donC# 3) et pour vous assurer qu'ils sont en ordre (vous recevez 3, 2, puis 1 - mais lorsque vous les enregistrez dans le fichier, vous devez vous assurer que les paquets sont sauvegardés dans le bon ordre, 1, 2, puis 3).

Donc, pour votre mission, eh bien, cela dépendra de ce protocole que vous devez/sont autorisés à utiliser.

2

Si vous utilisez un protocole de transfert basé sur UDP, vous devrez décomposer le fichier en morceaux pour la transmission réseau. Vous devrez également les réassembler dans le bon ordre à la réception et vérifier les résultats. Si vous utilisez un protocole de transfert basé sur TCP, tout cela sera pris en charge sous le capot.

Vous devriez consulter Beej's Guide to Network Programming pour savoir comment envoyer et recevoir des données et utiliser des sockets en général. Il explique la plupart des choses sur lesquelles vous demandez.

0

Il y a plusieurs façons de transférer des fichiers. Si vous transférez des fichiers dans un manoir sans perte, alors vous allez essentiellement diviser le fichier en morceaux. Étiquetez chaque morceau avec un numéro de séquence. Envoyez les morceaux de l'autre côté et reconstituez le fichier. Les protocoles orientés flux sont plus simples puisque les paquets seront retransmis en cas de perte. Si votre utilisation d'un protocole non fiable, alors vous aurez besoin de réémettre paquets manquants et des morceaux reséquencées qui ne sont pas dans le bon ordre.

Si le transfert est acceptable avec perte (comme le transfert de données de jeu vidéo ou en ligne), utilisez un protocole non fiable. Le transfert avec perte est plus simple car vous n'avez pas besoin de retransmettre les morceaux manquants. Tout ce que vous devez faire est de vous assurer que les morceaux sont traités dans le bon ordre.

De nombreux protocoles envoient un paquet de terminaison pour indiquer la fin de la transmission. Vous pouvez utiliser cette stratégie si vous ne voulez pas envoyer le nombre de morceaux de l'autre côté avant la transmission.