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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.