From ab0fea9a14fd6a8aadb6a973e9369af45ad495fd Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Sat, 8 Apr 2017 19:25:44 +0200 Subject: [PATCH] [plane][done] multicast request (not tested) + init sequence + fetch ip/port by multicast then connect to given TCP (ref #1) --- central-manager/lib/header.h | 11 +-- central-manager/lib/network/udp/server.h | 2 +- plane/Makefile | 8 +- plane/lib/header.h | 6 +- plane/lib/network/tcp/client.c | 43 ++++++++++- plane/lib/network/tcp/client.h | 23 ++++++ plane/lib/network/udp/client.c | 36 +++++++++ plane/lib/network/udp/client.h | 32 ++++++++ plane/plane.c | 93 +++++++++++++++++------- plane/plane.h | 8 +- 10 files changed, 222 insertions(+), 40 deletions(-) create mode 100644 plane/lib/network/udp/client.c create mode 100644 plane/lib/network/udp/client.h diff --git a/central-manager/lib/header.h b/central-manager/lib/header.h index bc1a2a5..a55d359 100644 --- a/central-manager/lib/header.h +++ b/central-manager/lib/header.h @@ -25,12 +25,13 @@ #include "data.h" /* vars */ - #define SRV_HOST "127.0.0.1" - #define UDP_MCST 4444 // multicast UDP port for PLANES - #define TCP_LIST 0x504c // TCP plane command (PL = 8076) + #define SERV_HOST "127.0.0.1" // adresse serveur + #define MCST_HOST "225.0.0.37" // adresse groupe multicast UDP + #define UDP_MCST 4444 // multicast UDP port for PLANES + #define TCP_LIST 0x504c // TCP plane command (PL = 8076) - #define UDP_VTER 4445 // viewTerm listener - #define UDP_CTER 4446 // ctrlTerm listener + #define UDP_VTER 4445 // viewTerm listener + #define UDP_CTER 4446 // ctrlTerm listener #define MAX_BUF_LEN 512 #define MAX_TCP_THR 10 diff --git a/central-manager/lib/network/udp/server.h b/central-manager/lib/network/udp/server.h index b78eb3c..be4e73e 100644 --- a/central-manager/lib/network/udp/server.h +++ b/central-manager/lib/network/udp/server.h @@ -13,7 +13,7 @@ * * ==OUT== * @pListenSocket Pointeur sur le à remplir => contiendra un pointeur sur la socket d'écoute - * @pAddr Pointeur sur le à remplir => contiendra un pointeur sur les infos server + * @pInfo Pointeur sur le à remplir => contiendra un pointeur sur les infos server * * ==RETURN== * @status -1 si erreur, sinon 0 diff --git a/plane/Makefile b/plane/Makefile index e64a998..2e4e1c4 100644 --- a/plane/Makefile +++ b/plane/Makefile @@ -9,9 +9,13 @@ default: all lib/network/tcp/client.o: lib/header.h lib/network/tcp/client.h lib/network/tcp/client.c gcc $(CFLAGS) -c -o lib/network/tcp/client.o lib/network/tcp/client.c +lib/network/udp/client.o: lib/header.h lib/network/udp/client.h lib/network/udp/client.c + gcc $(CFLAGS) -c -o lib/network/udp/client.o lib/network/udp/client.c + # Compiles the Plane -boot: lib/network/tcp/client.o plane.h plane.c - gcc $(CFLAGS) -o boot lib/network/tcp/client.o plane.c -lm +# -lm flag for math lib +boot: lib/network/tcp/client.o lib/network/udp/client.o plane.h plane.c + gcc $(CFLAGS) -o boot lib/network/tcp/client.o lib/network/udp/client.o plane.c -lm # Run full compilation diff --git a/plane/lib/header.h b/plane/lib/header.h index eb50d23..03a92ee 100644 --- a/plane/lib/header.h +++ b/plane/lib/header.h @@ -7,8 +7,6 @@ #include #include #include - #include - #include /* sys */ #include @@ -22,8 +20,8 @@ #include /* vars */ - #define SRV_HOST "127.0.0.1" - #define SRV_PORT 0x504c + #define MCST_HOST "225.0.0.37" // adresse groupe multicast UDP + #define MCST_PORT 0x504c // port multicast UDP #define MAX_BUF_LEN 512 diff --git a/plane/lib/network/tcp/client.c b/plane/lib/network/tcp/client.c index a7f5447..ebb2562 100644 --- a/plane/lib/network/tcp/client.c +++ b/plane/lib/network/tcp/client.c @@ -1 +1,42 @@ -#include "client.h" \ No newline at end of file +#include "client.h" + + +int TCP_CONNECT(int* pSocket, const char* pAddr, const int pPort, struct sockaddr_in* pInfo){ + + /* [0] Initialisation des variables + =========================================================*/ + *pSocket = -1; + + + /* [1] Création de la socket + =======================================================*/ + /* 1. Création de la socket */ + *pSocket = socket(AF_INET, SOCK_STREAM, 0); + + /* 2. Gestion erreur */ + if( *pSocket < 0 ) + return -1; + + + /* [2] On définit les infos de la socket + =========================================================*/ + /* (1) Reset des valeurs */ + bzero(pInfo, sizeof(struct sockaddr_in)); + + /* (2) On définit les infos */ + pInfo->sin_family = AF_INET; + pInfo->sin_port = htons(pPort); + pInfo->sin_addr.s_addr = inet_addr(pAddr); + + + /* [3] On se connecte au serveur + =========================================================*/ + if( connect(*pSocket, (struct sockaddr*) pInfo, sizeof(struct sockaddr_in)) < 0 ) + return -1; + + + + /* [n] Code succès + =========================================================*/ + return 0; +} diff --git a/plane/lib/network/tcp/client.h b/plane/lib/network/tcp/client.h index 831d56a..28d6cf2 100644 --- a/plane/lib/network/tcp/client.h +++ b/plane/lib/network/tcp/client.h @@ -3,5 +3,28 @@ + #include "../../header.h" + + + /* Créée une socket TCP et la connecte + crée le sockaddr_in pour la suite + * + * ==IN== + * @pAddr Adresse du serveur TCP + * @pPort Port du serveur TCP + * + * ==OUT== + * @pSocket Pointeur sur le à remplir => contiendra un pointeur sur la socket créée + * @pInfo Pointeur sur le à remplir => contiendra un pointeur sur les infos server + * + * ==RETURN== + * @status -1 si erreur, sinon 0 + * + * @history + * [1] Création de la socket + * [2] On définit les infos du serveur + * [3] On se connecte au serveur + * + */ + int TCP_CONNECT(int* pSocket, const char* pAddr, const int pPort, struct sockaddr_in* pInfo); #endif \ No newline at end of file diff --git a/plane/lib/network/udp/client.c b/plane/lib/network/udp/client.c new file mode 100644 index 0000000..3c6b1b1 --- /dev/null +++ b/plane/lib/network/udp/client.c @@ -0,0 +1,36 @@ +#include "client.h" + + + +int UDP_SOCKET(int* pSocket, const char* pAddr, const int pPort, struct sockaddr_in* pInfo){ + + /* [0] Initialisation des variables + =========================================================*/ + *pSocket = -1; + + + /* [1] Création de la socket + =======================================================*/ + /* 1. Création de la socket */ + *pSocket = socket(AF_INET, SOCK_DGRAM, 0); + + /* 2. Gestion erreur */ + if( *pSocket < 0 ) + return -1; + + + /* [2] On définit les infos de la socket + =========================================================*/ + /* (1) Reset des valeurs */ + bzero(pInfo, sizeof(struct sockaddr_in)); + + /* (2) On définit les infos */ + pInfo->sin_family = AF_INET; + pInfo->sin_port = htons(pPort); + pInfo->sin_addr.s_addr = inet_addr(pAddr); + + + /* [n] Code succès + =========================================================*/ + return 0; +} diff --git a/plane/lib/network/udp/client.h b/plane/lib/network/udp/client.h new file mode 100644 index 0000000..1d00366 --- /dev/null +++ b/plane/lib/network/udp/client.h @@ -0,0 +1,32 @@ +#ifndef _LIB_NETWORK_UDP_CLIENT_H_ + #define _LIB_NETWORK_UDP_CLIENT_H_ + + + + #include "../../header.h" + + + /* Créée une socket UDP + crée le sockaddr_in pour la suite + * + * ==IN== + * @pAddr Adresse du groupe multicast UDP + * @pPort Port d'écoute UDP + * + * ==OUT== + * @pSocket Pointeur sur le à rempliR => contiendra un pointeur sur la socket créée + * @pInfo Pointeur sur le à remplir => contiendra un pointeur sur les infos server + * + * ==RETURN== + * @status -1 si erreur, sinon 0 + * + * @history + * [1] Création de la socket + * [2] On définit les infos de la socket + * [3] On crée la socket + * + */ + int UDP_SOCKET(int* pSocket, const char* pAddr, const int pPort, struct sockaddr_in* pInfo); + + + +#endif \ No newline at end of file diff --git a/plane/plane.c b/plane/plane.c index 8a210ca..f9a1aae 100644 --- a/plane/plane.c +++ b/plane/plane.c @@ -6,7 +6,8 @@ char numero_vol[6]; struct coord crd; struct control ctrl; -int clientsock = -1; +int mcast_socket = -1; +int commu_socket = -1; char buffer[MAX_BUF_LEN] = {0}; /******************************** @@ -14,51 +15,91 @@ char buffer[MAX_BUF_LEN] = {0}; ********************************/ int open_communication(){ - // fonction à implémenter qui permet d'entrer en communication via TCP - // avec le gestionnaire de vols - /* 0. Initialisation des variables */ - // struct hostent* host = NULL; - struct sockaddr_in server; + struct sockaddr_in udp, tcp; // données des sockets + char buffer[MAX_BUF_LEN] = {0}; // buffer + unsigned short serverPort; // port TCP donné par requête multicast UDP + char serverAddr[INET_ADDRSTRLEN+1]; // adresse TCP donné par requête multicast UDP + int status; - /* 1. Création de la socket */ - clientsock = socket(AF_INET, SOCK_STREAM, 0); - /* 1bis. Gestion erreur socket */ - if( clientsock < 0 ) + /* [1] Socket Multicast UDP + =========================================================*/ + + + /* (1) Création socket multicast + ---------------------------------------------------------*/ + if( UDP_SOCKET(&mcast_socket, MCST_HOST, MCST_PORT, &udp) < 0 ) return 0; - /* 2. Hostname Lookup */ - // host = gethostbyname(SRV_HOST); - // /* 2bis. Gestion erreur */ - // if( host == NULL ) - // return 0; + /* (2) Envoi séquence initialisation avion + ---------------------------------------------------------*/ + /* 1. Construction séquence d'initialisation */ + memcpy(buffer, numero_vol, sizeof(char)*6); - /* 3. Mise à jour des infos serveur */ - bzero(&server, sizeof(struct sockaddr_in)); - server.sin_family = AF_INET; - server.sin_port = htons(SRV_PORT); - server.sin_addr.s_addr = inet_addr(SRV_HOST); + /* 2. Envoi séquence */ + if( sendto(mcast_socket, buffer, MAX_BUF_LEN, 0, (struct sockaddr*) &udp, sizeof(struct sockaddr_in)) < 0 ){ + close(mcast_socket); + return 0; + } - // // On récupère l'adresse serveur du lookup - // memcpy(&server->sin_addr.s_addr, *(host->h_addr_list), host->h_length); - /* 4. Connection */ - if( connect(clientsock, (struct sockaddr*) &server, sizeof(struct sockaddr_in)) < 0 ) + /* (3) Attente réponse SGCA -> adresse+port TCP + ---------------------------------------------------------*/ + /* 1. Attente réponse */ + status = recv(mcast_socket, buffer, MAX_BUF_LEN, 0); + + /* 2. Gestion erreur */ + if( status < 0 ){ + close(mcast_socket); + return 0; + } + + /* 3. Vérification taille */ + if( status < sizeof(char)*INET_ADDRSTRLEN+sizeof(unsigned short) ){ + close(mcast_socket); + return 0; + } + + /* 4. On récupère les données */ + memcpy(serverAddr, buffer, sizeof(char)*INET_ADDRSTRLEN ); + memcpy(&serverPort, buffer+sizeof(char)*INET_ADDRSTRLEN, sizeof(unsigned short) ); + + + + + + + /* [2] Socket communication TCP + =========================================================*/ + + /* (1) Création socket TCP + connection + ---------------------------------------------------------*/ + /* 1. Création socket TCP + connection serveur */ + if( TCP_CONNECT(&commu_socket, serverAddr, serverPort, &tcp) < 0 ) return 0; return 1; } + + + void fermer_communication(){ // fonction à implémenter qui permet de fermer la communication // avec le gestionnaire de vols } void envoyer_caracteristiques(){ - // fonction à implémenter qui envoie l'ensemble des caractéristiques - // courantes de l'plane au gestionnaire de vols + + /* [0] Initialisation des variables + =========================================================*/ + + + + + } /******************************** diff --git a/plane/plane.h b/plane/plane.h index ec65512..a4bfa18 100644 --- a/plane/plane.h +++ b/plane/plane.h @@ -1,8 +1,14 @@ #ifndef _PLANE_H_ #define _PLANE_H_ - + + #include + #include + #include "lib/header.h" + #include "lib/network/udp/client.h" + #include "lib/network/tcp/client.h" + #define ALTMAX 20000