From 629c100c3e6a548989189c1b19bc15bf1cccbdb9 Mon Sep 17 00:00:00 2001 From: achemin1 Date: Fri, 22 Jan 2021 15:29:28 +0100 Subject: [PATCH] feat: clients... --- Makefile | 5 +++-- client.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ client.h | 13 +++++++++++++ server.c | 1 + virtual_client.c | 7 ++++++- 5 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 client.c create mode 100644 client.h diff --git a/Makefile b/Makefile index baf5cff..575085e 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ # OBJS_SWITCH=libnet.o virtual_bridge.o server.o -OBJS_CLIENT=libnet.o virtual_client.o +OBJS_CLIENT=libnet.o virtual_client.o client.o CFLAGS += -Wall -DDEBUG @@ -28,5 +28,6 @@ virtual_client: $(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 +virtual_client.o: virtual_client.c libnet.h client.h server.o: server.c +client.o: client.c diff --git a/client.c b/client.c new file mode 100644 index 0000000..1764c76 --- /dev/null +++ b/client.c @@ -0,0 +1,83 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "client.h" +#include +#define MAX_TAMPON 512 + + + + + +int connexionServeur(char *hote,char *service){ +struct addrinfo precisions,*resultat,*origine; +int statut; +int s; + +/* Creation de l'adresse de socket */ +memset(&precisions,0,sizeof precisions); +precisions.ai_family=AF_UNSPEC; +precisions.ai_socktype=SOCK_STREAM; +statut=getaddrinfo(hote,service,&precisions,&origine); +if(statut<0){ perror("connexionServeur.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("connexionServeur.socket"); exit(EXIT_FAILURE); } + +/* Connection de la socket a l'hote */ +if(connect(s,resultat->ai_addr,resultat->ai_addrlen)<0) return -1; + +/* Liberation de la structure d'informations */ +freeaddrinfo(origine); + +return s; +} + + + + +int boucle(int s) +{ + + /* Boucle de communication avec le serveur */ + struct pollfd descripteurs[2]; + descripteurs[0].fd=s; + descripteurs[0].events=POLLIN; + descripteurs[1].fd=0; + descripteurs[1].events=POLLIN; + while(1){ + char tampon[MAX_TAMPON]; + int nb=poll(descripteurs,2,-1); + if(nb<0){ perror("main.poll"); exit(EXIT_FAILURE); } + if((descripteurs[0].revents&POLLIN)!=0){ + int taille=read(s,tampon,MAX_TAMPON); + if(taille<=0) break; + write(1,tampon,taille); + } + if((descripteurs[1].revents&POLLIN)!=0){ + int taille=read(0,tampon,MAX_TAMPON); + if(taille<=0) break; + write(s,tampon,taille); + } + } + + /* On termine la connexion */ + shutdown(s,SHUT_RDWR); + + return 0; + } + + + diff --git a/client.h b/client.h new file mode 100644 index 0000000..eb71bdf --- /dev/null +++ b/client.h @@ -0,0 +1,13 @@ +#ifndef CLIENT_H +#define CLIENT_H + + +int connexionServeur(char *hote,char *service); +int boucle(int s); + + + + + +#endif + diff --git a/server.c b/server.c index 0fca7a7..2a31787 100644 --- a/server.c +++ b/server.c @@ -145,6 +145,7 @@ int boucleServeur2(int ecoute) //if longueurPoll <1024 //TODO A GERER descripteurs[LongueurPoll].fd = dialogue; + descripteurs[LongueurPoll].revents=0; LongueurPoll ++; printf("Nouveau LongueurPoll : %i\n", LongueurPoll); diff --git a/virtual_client.c b/virtual_client.c index 06f8857..89b1682 100644 --- a/virtual_client.c +++ b/virtual_client.c @@ -1,3 +1,4 @@ + /**** Fichier principal pour le client du pont virtuel ****/ /** Fichiers d'inclusion **/ @@ -7,9 +8,10 @@ #include #include - +#include "client.h" #include "libnet.h" + /** Quelques constantes **/ /** Variables globales */ @@ -30,10 +32,13 @@ fprintf(stdout,"Pont sur %s port %s\n",serveur,service); #endif // Connexion au serveur +int s=connexionServeur(serveur, service); +if(s<0){ fprintf(stderr,"Erreur de connexion au serveur\n"); exit(EXIT_FAILURE); } // Ouverture de l'interface reseau // Communication avec le serveur +boucle(s); return 0; } -- libgit2 0.21.2