Bonjour bonjour,
J'ai un mini-projet de réseau. Il s'agit de faire un client/serveur en TCP.
J'aimerais avoir votre avis, ce que vous en pensez et si il y a des choses à améliorer.
Commençons par le serveur :
Et le 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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86 #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <netinet/in.h> #include <stdlib.h> //Fonction permettant l'affichage de l'utilisation du programme void usage(){ printf("projet_serveur :\n\nUSAGE\t\t: ./serveur numeroPort nomNouveauFichier \n\nnumeroPort \t\t- numero du port \nnomNouveauFichier \t- nom du fichier de sauvegarde\n"); } int main(int argc,char *argv[]){ if(argc != 3){ usage(); exit(0); } char mess_recu[BUFSIZ],mess_envoi[BUFSIZ]; int pp,d_sock,cc,l,n,m,i; int longe,service; char tab[128]; int nb=128; char buffer[nb]; //le decalage du chiffrement de cesar int decalage = 5; struct sockaddr_in serveur = {AF_INET}; struct sockaddr_in client; /* le numero de port */ int numport; char *p_conv = NULL; numport = (int)strtol(argv[1],&p_conv,10); serveur.sin_port=numport; /* numero de port */ serveur.sin_family=AF_INET; serveur.sin_addr.s_addr=INADDR_ANY; d_sock=socket(AF_INET,SOCK_STREAM,0); /* procole TCP */ if(d_sock<0){ perror("Erreur a la creation de socket"); exit(0); } pp=bind(d_sock,(struct sockaddr*)&serveur,sizeof(serveur)); printf("serveur pret\n"); l=listen(d_sock,1); longe=sizeof(struct sockaddr_in); service=accept(d_sock,(struct sockaddr *)&client,&longe); printf("accept= %d\n",service); /*reception du message et creation du nouveau fichier */ int fd = creat(argv[2],0755); n=read(service,buffer,nb); if(n<0){ perror("Impossible de lire le fichier"); exit(0); } //pour chaque caractere du fichier, tant que le buffer a quelque chose, on applique le déchiffrement de cesar sur le buffer //autrement dit, on decale chaque lettre dans le sens inverse du chiffrement à l'aide du décalage précédemment défini i=0; while(buffer[i]!='\0'){ buffer[i]=buffer[i]-decalage; i++; } //on ecrit dans le nouveau fichier while(n>0){ m=write(fd,buffer,n); if(m<0){ perror("Impossible d'ecrire dans le fichier"); exit(0); } n=read(service,buffer,nb); } printf("\a"); //Fais un joli bip système pour dire que le fichier est recu. printf("---------------Fichier recu----------------\n"); //On ferme la socket, ainsi que le descripteur de fichier close(d_sock); close(fd); }
Voilà ! Qu'est ce que vous en pensez ?
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdlib.h> //Fonction permettant l'affichage de l'utilisation du programme void usage(){ printf("USAGE :\t ./client fichierAtransferer nomMachine numeroPort \n\nfichierAtransferer\t- Fichier a transferer\nnomMachine\t\t- nom du serveur\nnumeroPort \t\t- numero du port \nnomNouveauFichier \t- nom du fichier de sauvegarde\n"); } int main(int argc,char *argv[]){ if(argc != 4){ usage(); exit(0); } struct sockaddr_in serveur; struct hostent *hp; char mess_recu[BUFSIZ], mess_envoi[BUFSIZ],tab[128]; int sock,cc,errno,i,j,n,l,d_sock,m; int longe,service; int nb=128; char buffer[nb]; int taille; //le decalage du chiffrement de cesar int decalage = 5; /* le numero de port */ int numport; char *p_conv = NULL; numport = (int)strtol(argv[3],&p_conv,10); hp=gethostbyname(argv[2]); /* adresse IP du serveur */ memcpy(&serveur.sin_addr,hp->h_addr,hp->h_length); serveur.sin_port=numport; /* numéro de port */ serveur.sin_family=AF_INET; sock=socket(AF_INET,SOCK_DGRAM,0); /* protocole TCP */ if(sock<0){ perror("Erreur a la creation de socket"); exit(0); } l=connect(sock,(struct sockaddr *)&serveur,sizeof(serveur)); /* fichier que l'on veut transferer */ int fd = open(argv[1],0); //ouverture du fichier n=read(fd,buffer,nb); if(n<0){ perror("Impossible de lire le fichier"); exit(0); } //pour chaque caractere du fichier, tant que le buffer a quelque chose, on applique le chiffrement de cesar sur le buffer //autrement dit, on decale chaque lettre à l'aide du décalage précédemment défini i=0; while(buffer[i]!='\0'){ buffer[i]=(buffer[i]+decalage); i++; } //on transmet le fichier while(n>0){ cc=write(sock,buffer,n); if(cc<0){ perror("Impossible d'ecrire dans le fichier"); exit(0); } n=read(fd,buffer,nb); } printf("---------------Fichier envoye----------------\n"); close(sock); close(fd); }
Est-ce qu'il y aurait beaucoup de modification pour lui permettre de faire de l'UDP ?
Cordialement,
shepounet
Partager