Commit 8d4694b6e094a35dffa06431c2a2a88774b18cf9

Authored by achemin1
1 parent 562c94d1

feat: server listening to 1 client

Makefile 0 → 100644
... ... @@ -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,9 @@
  1 +# Test serveur :
  2 +
  3 +On lance, sur 80 ça renvoie -1
  4 +Mais sur un autre, ça écoute
  5 +
  6 +On le voit avec la commande
  7 +netstat -lt
  8 + -l : listen
  9 + -t : tcp
... ...
libnet.c 0 → 100644
... ... @@ -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 +}
... ...
libnet.h 0 → 100644
... ... @@ -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);
... ...
server.c 0 → 100644
... ... @@ -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 +
... ...
server.h 0 → 100644
... ... @@ -0,0 +1,10 @@
  1 +#ifndef SERVER_H
  2 +#define SERVER_H
  3 +
  4 +int initialisationServeur(char *service,int connexions);
  5 +int boucleServeur(int ecoute,int (*traitement)(int));
  6 +
  7 +int serv_printf(int s);
  8 +int serv_gestionClient(int s);
  9 +
  10 +#endif
... ...
virtual_bridge.c 0 → 100644
... ... @@ -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 +}
... ...
virtual_client.c 0 → 100644
... ... @@ -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 +}
... ...