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 @@ |
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 @@ |
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 @@ |
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 @@ |
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 @@ |
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 @@ |
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 | +} | ... | ... |