|
|
|
|
Bonjour a tous,
je veux réaliser un envoi de fichier entre client et serveur ,et j'utilise les sockets. Seulement mes connaissances dans ce domaine sont assez limitées.
Les 2 scripts ci-dessous se compilent correctement, mais l'envoi ne fonctionne pas.
Je lance mon programme serveur (qui doit recevoir le fichier) ,ensuite je lance le client ,et sur le serveur j´ai ce message d´erreur: "fseek() :invalid argument".
Par contre, le serveur créer bien un fichier nommé fichier_recv.txt (fichier recu, qui doit etre la copie de celui envoyé),mais evidemment il n'y a rien dedans...
code coté serveur
http://rafb.net/p/kHfqOz75.html
code coté client (qui envoi les données)
http://rafb.net/p/0GoVWw67.html
Pouvez vous m'aider a faire fonctionner ce programme svp ??
Bonsoir,
int fin, pos_fin; pos_fin = fseek(fichier_dst, fin, SEEK_SET) Quand tu déclares une variable en faisant "int fin;", cette variable est placée à l'arrache dans la memoire. Et cette zone mémoire a probablement été déjà utilisée auparavant, donc fin prendra la valeur de ce qu'il ya avait avant à cet endroit. C'est donc tout à fait aléatoire ce que tu fais. De même fseek ne retourne pas la nouvelle position du pointeur fichier. Il retourne 0 ou -1. Si tu veux la position de la fin du fichier, il faut faire (après ça, attention à remettre le pointeur de fichier où il était avant): int pos_fin; fseek(fichier, 0, SEEK_END); pos_fin=ftell(fichier); De même le fait d'utiliser fseek ne mettra pas des zero là ou il ya du vide dans le fichier. fseek ne fait que déplacer le pointeur du fichier. _ Attention avec fwrite, tu mets fwrite(&get_recep, sizeof(char), strlen(get_recep), fichier_dst); Mais get_recp est de type (char[]). fwrite ne demande qu'un pointeur en premier argument, et toi tu as mis l'adresse d'un tableau (soit un pointeur vers un tableau). Un tableau est déjà un pointeur, donc c'est comme si tu mettais un pointeur vers un pointeur. Met juste fwrite(get_recp,....) Coté client Toujours le même problème avec fseek. Tu fais "fseek (fichier_src, debut, SEEK_SET);" Tu viens d'ouvrir ton fichier, il pointe déjà vers le début. D'ailleurs, début est déclaré mais pas initialisé (valeur aléatoire). Et le début est forcément egal à 0. Donc met directement la variable current à 0, ça suffira. _Plus loin tu fais: while (((nb_lu > 0) && (nb_lu < fin - current))) Encore une fois, fin est déclaré mais n'est pas initialisé. Utilise la combinaison fseek/ftell pour avoir la valeur de la fin. Ensuite, tu peux très bien avoir lu en une fois jusqu'à la fin. Imagine qu'il ya 9 caractères dans ton fichier, tu fais une première lecture, ça donne: current=0 fin=9 nb_lu=9 Ca ne passera pas la boucle. Fais plutôt: while (((nb_lu > 0) && (nb_lu <= fin - current))) Voire même (il ya des parenthèses inutiles): while ((nb_lu > 0) && (nb_lu < fin - current)) Et voilà. Si tu fais de la programmation avec socket, je te conseille l'excellent logiciel Wireshark (anciennement ethereal). C'est un sniffeur de paquets réseaux. Ca te permet de savoir si une communication passe bien ou pas, sinon, à quelle moment ça foire et pourquoi etc.... C'est notamment grâce à ça que j'ai pu trouver quelques endroits qui coincent dans ton programme :-) Un petit bilan avec deux patch. Si tu n'est pas familier avec les patchs, dis toi que les lignes précédées d'un signe "-" sont celles qui ont été supprimées et celles précédées d'un "+" sont celles qui ont été rajoutées (pour remplacer ce qui a été supprimé finalement, donc un "-" sera suivi d'un "+"). Je te le mets sous forme de patch pour que tu puisses localiser les erreurs: Fichier client: http://pastebin.bricou.org/419 Fichier serveur: http://pastebin.bricou.org/420 ..et le...le...enfin, non parce c'est...ya...quand...bah tu sais là le... |
Franchement merci beaucoup pour ta réponse très détaillée; Elle m'a permis d'y voir un peu + clair sur mon code.
|
Merci beaucoup kilian,j'ai encore un soucis lol,
|
Bonjour, je remet a jour mon post car j'ai un problème pour envoyer le fichier depuis un client WINDOWS vers le serveur (qui lui reste en linux).
|
Tien voici mon msn: dr_octopus74@hotmail.com
|
/**************************************************************************/
|
Salut, j'ai pas trop compris ton message moih.
|
Répondre à assaad
|