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 :
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
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); }
Merci d'avance.
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 }
Partager