Commit 8d4694b6e094a35dffa06431c2a2a88774b18cf9
1 parent
562c94d1
feat: server listening to 1 client
Showing
8 changed files
with
306 additions
and
0 deletions
Show diff stats
@@ -0,0 +1,32 @@ | @@ -0,0 +1,32 @@ | ||
1 | +# | ||
2 | +# Makefile pour generer les executables du pont virtuel | ||
3 | +# | ||
4 | + | ||
5 | +OBJS_SWITCH=libnet.o virtual_bridge.o server.o | ||
6 | +OBJS_CLIENT=libnet.o virtual_client.o | ||
7 | + | ||
8 | +CFLAGS += -Wall -DDEBUG | ||
9 | + | ||
10 | +all: virtual_bridge virtual_client | ||
11 | + | ||
12 | +# | ||
13 | +# La cible de nettoyage | ||
14 | +# | ||
15 | + | ||
16 | +clean: | ||
17 | + rm -f core *.o virtual_bridge virtual_client | ||
18 | + | ||
19 | +# | ||
20 | +# Les cibles | ||
21 | +# | ||
22 | + | ||
23 | +virtual_bridge: $(OBJS_SWITCH) | ||
24 | + $(CC) $(CFLAGS) -o $@ $(OBJS_SWITCH) | ||
25 | +virtual_client: $(OBJS_CLIENT) | ||
26 | + $(CC) $(CFLAGS) -o $@ $(OBJS_CLIENT) | ||
27 | + | ||
28 | + | ||
29 | +libnet.o: libnet.c libnet.h | ||
30 | +virtual_bridge.o: virtual_bridge.c libnet.h server.h | ||
31 | +virtual_client.o: virtual_client.c libnet.h | ||
32 | +server.o: server.c |
README.md
@@ -0,0 +1,53 @@ | @@ -0,0 +1,53 @@ | ||
1 | +/** fichier libnet.c **/ | ||
2 | + | ||
3 | +/************************************************************/ | ||
4 | +/** Ce fichier contient des fonctions reseau. **/ | ||
5 | +/************************************************************/ | ||
6 | + | ||
7 | +/**** Fichiers d'inclusion ****/ | ||
8 | + | ||
9 | +#include <unistd.h> | ||
10 | +#include <string.h> | ||
11 | +#include <fcntl.h> | ||
12 | + | ||
13 | +#include <sys/types.h> | ||
14 | +#include <sys/socket.h> | ||
15 | +#include <sys/ioctl.h> | ||
16 | +#include <linux/if.h> | ||
17 | +#include <linux/if_tun.h> | ||
18 | + | ||
19 | +#include "libnet.h" | ||
20 | + | ||
21 | +/**** Constantes ****/ | ||
22 | + | ||
23 | +#define TAP_PRINCIPAL "/dev/net/tun" | ||
24 | + | ||
25 | +/**** Variables globales *****/ | ||
26 | + | ||
27 | +/**** Fonctions de gestion des sockets ****/ | ||
28 | + | ||
29 | +/**** Fonctions de gestion des interfaces virtuelles ****/ | ||
30 | + | ||
31 | +/** Ouverture d'une interface Ethernet virtuelle **/ | ||
32 | + | ||
33 | +int creationInterfaceVirtuelle(char *nom) | ||
34 | +{ | ||
35 | +struct ifreq interface; | ||
36 | +int fd,erreur; | ||
37 | + | ||
38 | +/* Ouverture du peripherique principal */ | ||
39 | +if((fd=open(TAP_PRINCIPAL,O_RDWR))<0) return fd; | ||
40 | + | ||
41 | +/* Preparation de la structure */ | ||
42 | +memset(&interface,0,sizeof(interface)); | ||
43 | +interface.ifr_flags=IFF_TAP|IFF_NO_PI; | ||
44 | +if(nom!=NULL) strncpy(interface.ifr_name,nom,IFNAMSIZ); | ||
45 | + | ||
46 | +/* Creation de l'interface */ | ||
47 | +if((erreur=ioctl(fd,TUNSETIFF,(void *)&interface))<0){ close(fd); return erreur; } | ||
48 | + | ||
49 | +/* Recuperation du nom de l'interface */ | ||
50 | +if(nom!=NULL) strcpy(nom,interface.ifr_name); | ||
51 | + | ||
52 | +return fd; | ||
53 | +} |
@@ -0,0 +1,19 @@ | @@ -0,0 +1,19 @@ | ||
1 | +/** fichier libnet.h **/ | ||
2 | + | ||
3 | +/******************************************************************/ | ||
4 | +/** Ce fichier decrit les structures et les constantes utilisees **/ | ||
5 | +/** par les fonctions reseau. **/ | ||
6 | +/******************************************************************/ | ||
7 | + | ||
8 | +/**** Constantes ****/ | ||
9 | + | ||
10 | +/** Nombre maximum de connexions tamponnees pour le serveur **/ | ||
11 | + | ||
12 | +#define MAX_CONNEXIONS 32 | ||
13 | + | ||
14 | +/**** Fonctions ****/ | ||
15 | + | ||
16 | +int connexionServeur(char *hote,char *service); | ||
17 | +int initialisationServeur(char *service,int connexions); | ||
18 | +int read_fixed(int descripteur,unsigned char *array,int size); | ||
19 | +int creationInterfaceVirtuelle(char *nom); |
@@ -0,0 +1,105 @@ | @@ -0,0 +1,105 @@ | ||
1 | +#include <sys/types.h> | ||
2 | +#include <sys/socket.h> | ||
3 | +#include <stdlib.h> | ||
4 | +#include <stdio.h> | ||
5 | +#include <string.h> | ||
6 | +#include <netinet/in.h> | ||
7 | +#include <sys/un.h> | ||
8 | +#include <netdb.h> | ||
9 | +#include <netinet/tcp.h> | ||
10 | +#include "server.h" | ||
11 | + | ||
12 | + | ||
13 | +#define MAX_LIGNE 512 | ||
14 | + | ||
15 | + | ||
16 | +int initialisationServeur(char *service,int connexions){ | ||
17 | + struct addrinfo precisions; | ||
18 | + struct addrinfo *resultat; | ||
19 | + struct addrinfo *origine; | ||
20 | + int statut; | ||
21 | + int s; | ||
22 | + | ||
23 | + /* Construction de la structure adresse */ | ||
24 | + memset(&precisions,0,sizeof precisions); | ||
25 | + precisions.ai_family=AF_UNSPEC; | ||
26 | + precisions.ai_socktype=SOCK_STREAM; | ||
27 | + precisions.ai_flags=AI_PASSIVE; | ||
28 | + statut=getaddrinfo(NULL,service,&precisions,&origine); | ||
29 | + if(statut<0){ perror("initialisationServeur.getaddrinfo"); exit(EXIT_FAILURE); } | ||
30 | + struct addrinfo *p; | ||
31 | + for(p=origine,resultat=origine;p!=NULL;p=p->ai_next) | ||
32 | + if(p->ai_family==AF_INET6){ resultat=p; break; } | ||
33 | + | ||
34 | + /* Creation d'une socket */ | ||
35 | + s=socket(resultat->ai_family,resultat->ai_socktype,resultat->ai_protocol); | ||
36 | + if(s<0){ perror("initialisationServeur.socket"); exit(EXIT_FAILURE); } | ||
37 | + | ||
38 | + /* Options utiles */ | ||
39 | + int vrai=1; | ||
40 | + if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&vrai,sizeof(vrai))<0){ | ||
41 | + perror("initialisationServeur.setsockopt (REUSEADDR)"); | ||
42 | + exit(EXIT_FAILURE); | ||
43 | + } | ||
44 | + if(setsockopt(s,IPPROTO_TCP,TCP_NODELAY,&vrai,sizeof(vrai))<0){ | ||
45 | + perror("initialisationServeur.setsockopt (NODELAY)"); | ||
46 | + exit(EXIT_FAILURE); | ||
47 | + } | ||
48 | + | ||
49 | + /* Specification de l'adresse de la socket */ | ||
50 | + statut=bind(s,resultat->ai_addr,resultat->ai_addrlen); | ||
51 | + if(statut<0) return -1; | ||
52 | + | ||
53 | + /* Liberation de la structure d'informations */ | ||
54 | + freeaddrinfo(origine); | ||
55 | + | ||
56 | + /* Taille de la queue d'attente */ | ||
57 | + statut=listen(s,connexions); | ||
58 | + if(statut<0) return -1; | ||
59 | + | ||
60 | + return s; | ||
61 | + | ||
62 | +} | ||
63 | + | ||
64 | + | ||
65 | +int boucleServeur(int ecoute,int (*traitement)(int)) | ||
66 | +{ | ||
67 | + int dialogue; | ||
68 | + while(1){ | ||
69 | + | ||
70 | + /* Attente d'une connexion */ | ||
71 | + if((dialogue=accept(ecoute,NULL,NULL))<0) return -1; | ||
72 | + | ||
73 | + /* Passage de la socket de dialogue a la fonction de traitement */ | ||
74 | + if(traitement(dialogue)<0){ shutdown(ecoute,SHUT_RDWR); return 0;} | ||
75 | + | ||
76 | + } | ||
77 | +} | ||
78 | + | ||
79 | + | ||
80 | +int serv_printf(int s){ | ||
81 | + printf("Hello %i\n", s); | ||
82 | + return 0; | ||
83 | +} | ||
84 | + | ||
85 | + | ||
86 | +int serv_gestionClient(int s){ | ||
87 | + | ||
88 | + /* Obtient une structure de fichier */ | ||
89 | + FILE *dialogue=fdopen(s,"a+"); | ||
90 | + if(dialogue==NULL){ perror("gestionClient.fdopen"); exit(EXIT_FAILURE); } | ||
91 | + | ||
92 | + /* Echo */ | ||
93 | + char ligne[MAX_LIGNE]; | ||
94 | + while(fgets(ligne,MAX_LIGNE,dialogue)!=NULL){ | ||
95 | + #ifdef DEBUG | ||
96 | + printf("> %s", ligne); | ||
97 | + #endif | ||
98 | + fprintf(dialogue,"> %s",ligne); | ||
99 | + } | ||
100 | + | ||
101 | + /* Termine la connexion */ | ||
102 | + fclose(dialogue); | ||
103 | + return 0; | ||
104 | +} | ||
105 | + |
@@ -0,0 +1,39 @@ | @@ -0,0 +1,39 @@ | ||
1 | +/**** Fichier principal pour le pont virtuel ****/ | ||
2 | + | ||
3 | +/** Fichiers d'inclusion **/ | ||
4 | + | ||
5 | +#include <stdio.h> | ||
6 | +#include <stdlib.h> | ||
7 | + | ||
8 | +#include <sys/types.h> | ||
9 | +#include <sys/socket.h> | ||
10 | +#include "server.h" | ||
11 | +#include "libnet.h" | ||
12 | + | ||
13 | +/** Quelques constantes **/ | ||
14 | + | ||
15 | +/** Variables globales **/ | ||
16 | + | ||
17 | +/** Fonctions **/ | ||
18 | + | ||
19 | +/* Fonction principale */ | ||
20 | +int main(int argc,char *argv[]){ | ||
21 | +// Analyse des arguments | ||
22 | +if(argc!=2){ | ||
23 | + fprintf(stderr,"Syntaxe : bridge <port>\n"); | ||
24 | + exit(-1); | ||
25 | + } | ||
26 | + char *service=argv[1]; | ||
27 | + #ifdef DEBUG | ||
28 | + fprintf(stdout,"Port : %s\n",service); | ||
29 | +#endif | ||
30 | + | ||
31 | +// Initialisation du serveur | ||
32 | + int socket = initialisationServeur(service,1024);//1024 est la taille de la file dattente de listen | ||
33 | +// Traitement des connexions et des messages | ||
34 | + int ret = boucleServeur(socket, serv_gestionClient); | ||
35 | + | ||
36 | + printf("Finish %i\n",ret); | ||
37 | + | ||
38 | +return 0; | ||
39 | +} |
@@ -0,0 +1,39 @@ | @@ -0,0 +1,39 @@ | ||
1 | +/**** Fichier principal pour le client du pont virtuel ****/ | ||
2 | + | ||
3 | +/** Fichiers d'inclusion **/ | ||
4 | + | ||
5 | +#include <stdio.h> | ||
6 | +#include <stdlib.h> | ||
7 | + | ||
8 | +#include <sys/types.h> | ||
9 | +#include <sys/socket.h> | ||
10 | + | ||
11 | +#include "libnet.h" | ||
12 | + | ||
13 | +/** Quelques constantes **/ | ||
14 | + | ||
15 | +/** Variables globales */ | ||
16 | + | ||
17 | +/** Fonctions **/ | ||
18 | + | ||
19 | +/* Fonction principale */ | ||
20 | +int main(int argc,char *argv[]){ | ||
21 | +// Analyse des arguments | ||
22 | +if(argc!=3){ | ||
23 | + fprintf(stderr,"Syntaxe : client <serveur> <port>\n"); | ||
24 | + exit(-1); | ||
25 | + } | ||
26 | +char *serveur=argv[1]; | ||
27 | +char *service=argv[2]; | ||
28 | +#ifdef DEBUG | ||
29 | +fprintf(stdout,"Pont sur %s port %s\n",serveur,service); | ||
30 | +#endif | ||
31 | + | ||
32 | +// Connexion au serveur | ||
33 | + | ||
34 | +// Ouverture de l'interface reseau | ||
35 | + | ||
36 | +// Communication avec le serveur | ||
37 | + | ||
38 | +return 0; | ||
39 | +} |