Bonsoir,
Commencons par le fichier serveur.
_Si tu utilises la fonctions exit, il faut appeler le fichier d'en-tête sdtlib.h
Ca s'applique donc à tes deux fichiers sources.
_Ton main ne doit pas être de type void mais de type int. C'est une convention, un programme doit retourner une valeur.
_La fonction fopen, en cas d'echec, ne retourne pas -1 mais retourne NULL.
_ Il ya des soucis avec fseek.
fseek s'utilise comme ceci:
fseek(fichier, adresse, mode d'adessage)
Le mode d'adressage c'est soit SEEK_SET (adressage absolu), SEEK_END (adressage à partir de la fin), SEEK_CUR (adressage relatif => à partir de la position courante)
Et là, tu fais des trucs bizzares avec fseek, du genre:
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