Socket et envoie de fichier texte
Bonjour,
Je veux créer une petite application client-serveur pour le transfert des fichiers, genre un mini FTP pour les fichiers texte.
Mon problème est de réaliser l'envoi récursif: Le serveur reste toujours à l'écoute, et le client peut envoyer plusieurs fichiers; l'un après l'autre. Pour la partie client, je n'ai pas vraiment de problèmes, mais pour la partie serveur, quand je met une boucle infinie pour l'écoute, l'envoi n'aboutit pas. Je ne sais pas où est l'erreur.. PS: Je suis sous Fedora 18. Voici la partie serveur :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #include<stdio.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<netdb.h>
#include<string.h>
#define max 3000
main(){
int s,a,b,c,r,longueur;
struct sockaddr_in serveur,client;
struct hostent *adr_h;
//Remplissage de la structure serveur
serveur.sin_family=AF_INET;
serveur.sin_addr.s_addr=INADDR_ANY;
serveur.sin_port=htons(2502);
if((s=socket(AF_INET,SOCK_STREAM,0))==-1) perror("\nSocket : ");
else printf("\nSocket crée");
//Affecter un nom à la socket
if((b=bind(s,(struct sockaddr*)&serveur,sizeof(serveur)))==-1) perror("\nBind : ");
else printf("\nBind réussi");
//Construction de l'adresse
adr_h=gethostbyname("127.0.0.1");
bcopy((char *)adr_h->h_addr,(char *)&serveur.sin_addr,adr_h->h_length);
//Fonction listen : 5 connexion maximum
listen(s,5);
printf("\n\nLe serveur attend une connexion\n");
//Accept: Le serveur est prêt et attend des connexions
longueur=sizeof(client);
if((c=accept(s,(struct sockaddr *)&client,&longueur))<0) perror("\nConnexion échouée : ");
else {
printf("Connexion réussie avec le client\n\n"); //Communication avec le client
char nom[100]="";
printf("Entrez le chemin où vous voulez enregistrer le fichier: ");
scanf("%s",nom);
FILE* f= fopen(nom,"w+"); // Créer le fichier local avec le nom indiqué en mode écriture
char v[0]; // Variable pour la réception
do
{
recv(c,v,1,0); // Recevoir d'un seul caractère
if(v[0] == EOF ) break; // Si ce caractère est un End Of File (EOF), sortir de la boucle
fputs(v,f); // Ecrire le caractère dans le fichier
}while(1);
close(f); // Fermer du fichier
printf("Fichier bien reçu\n\n");
}
//Fermer les sockets
close(c);
close(s);
} |
Et la partie client :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<netdb.h>
#include<string.h>
#define max 3000
main()
{
int s,a,t;
struct hostent *adr_h;
struct sockaddr_in serveur;
char nom[100]="";
printf("\nEntrez le chemin du fichier que vous voulez envoyer: ");
scanf("%s",nom);
//***************** Remplissage de la structure serveur
serveur.sin_family=AF_INET;
serveur.sin_port=htons(2502);
//***************** Creation de la socket
if((s=socket(AF_INET,SOCK_STREAM,0))<0) perror("\nSocket : \n");
else printf("\nSocket créé\n");
//***************** Construction de l'adresse
if((adr_h=gethostbyname("127.0.0.1"))==0) perror("\nMachine inconnue");
else bcopy((char *)adr_h->h_addr,(char *)&serveur.sin_addr,adr_h->h_length);
//***************** Connexion au serveur
if(connect(s,(struct sockaddr *)&serveur,sizeof(serveur))<0) perror("\nEchec de la connexion avec le serveur");
else
{
FILE* f= fopen(nom,"r+"); // Ouvrir le fichier local en mode lecture
char v; // Variable d'envoi
do
{
v=fgetc(f); // Lire le caractère
t=send(s,(const char*)&v,sizeof(v),0); // Envoyer le caractère
}while(v!=EOF); // Reboucler si on n'atteint toujours pas la fin du fichier
close(f); // Fermer le fichier
printf("Fichier envoyé\n\n");
}
close(s); // Fermer la Socket
} |
Merci d'avance.