From 8d4694b6e094a35dffa06431c2a2a88774b18cf9 Mon Sep 17 00:00:00 2001 From: achemin1 Date: Thu, 21 Jan 2021 17:16:09 +0100 Subject: [PATCH] feat: server listening to 1 client --- Makefile | 32 ++++++++++++++++++++++++++++++++ README.md | 9 +++++++++ libnet.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ libnet.h | 19 +++++++++++++++++++ server.c | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ server.h | 10 ++++++++++ virtual_bridge.c | 39 +++++++++++++++++++++++++++++++++++++++ virtual_client.c | 39 +++++++++++++++++++++++++++++++++++++++ 8 files changed, 306 insertions(+), 0 deletions(-) create mode 100644 Makefile create mode 100644 libnet.c create mode 100644 libnet.h create mode 100644 server.c create mode 100644 server.h create mode 100644 virtual_bridge.c create mode 100644 virtual_client.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..baf5cff --- /dev/null +++ b/Makefile @@ -0,0 +1,32 @@ +# +# Makefile pour generer les executables du pont virtuel +# + +OBJS_SWITCH=libnet.o virtual_bridge.o server.o +OBJS_CLIENT=libnet.o virtual_client.o + +CFLAGS += -Wall -DDEBUG + +all: virtual_bridge virtual_client + +# +# La cible de nettoyage +# + +clean: + rm -f core *.o virtual_bridge virtual_client + +# +# Les cibles +# + +virtual_bridge: $(OBJS_SWITCH) + $(CC) $(CFLAGS) -o $@ $(OBJS_SWITCH) +virtual_client: $(OBJS_CLIENT) + $(CC) $(CFLAGS) -o $@ $(OBJS_CLIENT) + + +libnet.o: libnet.c libnet.h +virtual_bridge.o: virtual_bridge.c libnet.h server.h +virtual_client.o: virtual_client.c libnet.h +server.o: server.c diff --git a/README.md b/README.md index e69de29..5779863 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,9 @@ +# Test serveur : + +On lance, sur 80 ça renvoie -1 +Mais sur un autre, ça écoute + +On le voit avec la commande +netstat -lt + -l : listen + -t : tcp diff --git a/libnet.c b/libnet.c new file mode 100644 index 0000000..2aa2149 --- /dev/null +++ b/libnet.c @@ -0,0 +1,53 @@ +/** fichier libnet.c **/ + +/************************************************************/ +/** Ce fichier contient des fonctions reseau. **/ +/************************************************************/ + +/**** Fichiers d'inclusion ****/ + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "libnet.h" + +/**** Constantes ****/ + +#define TAP_PRINCIPAL "/dev/net/tun" + +/**** Variables globales *****/ + +/**** Fonctions de gestion des sockets ****/ + +/**** Fonctions de gestion des interfaces virtuelles ****/ + +/** Ouverture d'une interface Ethernet virtuelle **/ + +int creationInterfaceVirtuelle(char *nom) +{ +struct ifreq interface; +int fd,erreur; + +/* Ouverture du peripherique principal */ +if((fd=open(TAP_PRINCIPAL,O_RDWR))<0) return fd; + +/* Preparation de la structure */ +memset(&interface,0,sizeof(interface)); +interface.ifr_flags=IFF_TAP|IFF_NO_PI; +if(nom!=NULL) strncpy(interface.ifr_name,nom,IFNAMSIZ); + +/* Creation de l'interface */ +if((erreur=ioctl(fd,TUNSETIFF,(void *)&interface))<0){ close(fd); return erreur; } + +/* Recuperation du nom de l'interface */ +if(nom!=NULL) strcpy(nom,interface.ifr_name); + +return fd; +} diff --git a/libnet.h b/libnet.h new file mode 100644 index 0000000..0388b86 --- /dev/null +++ b/libnet.h @@ -0,0 +1,19 @@ +/** fichier libnet.h **/ + +/******************************************************************/ +/** Ce fichier decrit les structures et les constantes utilisees **/ +/** par les fonctions reseau. **/ +/******************************************************************/ + +/**** Constantes ****/ + +/** Nombre maximum de connexions tamponnees pour le serveur **/ + +#define MAX_CONNEXIONS 32 + +/**** Fonctions ****/ + +int connexionServeur(char *hote,char *service); +int initialisationServeur(char *service,int connexions); +int read_fixed(int descripteur,unsigned char *array,int size); +int creationInterfaceVirtuelle(char *nom); diff --git a/server.c b/server.c new file mode 100644 index 0000000..fedd808 --- /dev/null +++ b/server.c @@ -0,0 +1,105 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "server.h" + + +#define MAX_LIGNE 512 + + +int initialisationServeur(char *service,int connexions){ + struct addrinfo precisions; + struct addrinfo *resultat; + struct addrinfo *origine; + int statut; + int s; + + /* Construction de la structure adresse */ + memset(&precisions,0,sizeof precisions); + precisions.ai_family=AF_UNSPEC; + precisions.ai_socktype=SOCK_STREAM; + precisions.ai_flags=AI_PASSIVE; + statut=getaddrinfo(NULL,service,&precisions,&origine); + if(statut<0){ perror("initialisationServeur.getaddrinfo"); exit(EXIT_FAILURE); } + struct addrinfo *p; + for(p=origine,resultat=origine;p!=NULL;p=p->ai_next) + if(p->ai_family==AF_INET6){ resultat=p; break; } + + /* Creation d'une socket */ + s=socket(resultat->ai_family,resultat->ai_socktype,resultat->ai_protocol); + if(s<0){ perror("initialisationServeur.socket"); exit(EXIT_FAILURE); } + + /* Options utiles */ + int vrai=1; + if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&vrai,sizeof(vrai))<0){ + perror("initialisationServeur.setsockopt (REUSEADDR)"); + exit(EXIT_FAILURE); + } + if(setsockopt(s,IPPROTO_TCP,TCP_NODELAY,&vrai,sizeof(vrai))<0){ + perror("initialisationServeur.setsockopt (NODELAY)"); + exit(EXIT_FAILURE); + } + + /* Specification de l'adresse de la socket */ + statut=bind(s,resultat->ai_addr,resultat->ai_addrlen); + if(statut<0) return -1; + + /* Liberation de la structure d'informations */ + freeaddrinfo(origine); + + /* Taille de la queue d'attente */ + statut=listen(s,connexions); + if(statut<0) return -1; + + return s; + +} + + +int boucleServeur(int ecoute,int (*traitement)(int)) +{ + int dialogue; + while(1){ + + /* Attente d'une connexion */ + if((dialogue=accept(ecoute,NULL,NULL))<0) return -1; + + /* Passage de la socket de dialogue a la fonction de traitement */ + if(traitement(dialogue)<0){ shutdown(ecoute,SHUT_RDWR); return 0;} + + } +} + + +int serv_printf(int s){ + printf("Hello %i\n", s); + return 0; +} + + +int serv_gestionClient(int s){ + + /* Obtient une structure de fichier */ + FILE *dialogue=fdopen(s,"a+"); + if(dialogue==NULL){ perror("gestionClient.fdopen"); exit(EXIT_FAILURE); } + + /* Echo */ + char ligne[MAX_LIGNE]; + while(fgets(ligne,MAX_LIGNE,dialogue)!=NULL){ + #ifdef DEBUG + printf("> %s", ligne); + #endif + fprintf(dialogue,"> %s",ligne); + } + + /* Termine la connexion */ + fclose(dialogue); + return 0; +} + diff --git a/server.h b/server.h new file mode 100644 index 0000000..882f113 --- /dev/null +++ b/server.h @@ -0,0 +1,10 @@ +#ifndef SERVER_H +#define SERVER_H + +int initialisationServeur(char *service,int connexions); +int boucleServeur(int ecoute,int (*traitement)(int)); + +int serv_printf(int s); +int serv_gestionClient(int s); + +#endif diff --git a/virtual_bridge.c b/virtual_bridge.c new file mode 100644 index 0000000..cf1314f --- /dev/null +++ b/virtual_bridge.c @@ -0,0 +1,39 @@ +/**** Fichier principal pour le pont virtuel ****/ + +/** Fichiers d'inclusion **/ + +#include +#include + +#include +#include +#include "server.h" +#include "libnet.h" + +/** Quelques constantes **/ + +/** Variables globales **/ + +/** Fonctions **/ + +/* Fonction principale */ +int main(int argc,char *argv[]){ +// Analyse des arguments +if(argc!=2){ + fprintf(stderr,"Syntaxe : bridge \n"); + exit(-1); + } + char *service=argv[1]; + #ifdef DEBUG + fprintf(stdout,"Port : %s\n",service); +#endif + +// Initialisation du serveur + int socket = initialisationServeur(service,1024);//1024 est la taille de la file dattente de listen +// Traitement des connexions et des messages + int ret = boucleServeur(socket, serv_gestionClient); + + printf("Finish %i\n",ret); + +return 0; +} diff --git a/virtual_client.c b/virtual_client.c new file mode 100644 index 0000000..06f8857 --- /dev/null +++ b/virtual_client.c @@ -0,0 +1,39 @@ +/**** Fichier principal pour le client du pont virtuel ****/ + +/** Fichiers d'inclusion **/ + +#include +#include + +#include +#include + +#include "libnet.h" + +/** Quelques constantes **/ + +/** Variables globales */ + +/** Fonctions **/ + +/* Fonction principale */ +int main(int argc,char *argv[]){ +// Analyse des arguments +if(argc!=3){ + fprintf(stderr,"Syntaxe : client \n"); + exit(-1); + } +char *serveur=argv[1]; +char *service=argv[2]; +#ifdef DEBUG +fprintf(stdout,"Pont sur %s port %s\n",serveur,service); +#endif + +// Connexion au serveur + +// Ouverture de l'interface reseau + +// Communication avec le serveur + +return 0; +} -- libgit2 0.21.2