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 :

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);
}
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
#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);
}
Voilà ! Qu'est ce que vous en pensez ?
Est-ce qu'il y aurait beaucoup de modification pour lui permettre de faire de l'UDP ?

Cordialement,
shepounet