[plane][done] multicast request (not tested) + init sequence + fetch ip/port by multicast then connect to given TCP (ref #1)

This commit is contained in:
xdrm-brackets 2017-04-08 19:25:44 +02:00
parent 61581e393d
commit ab0fea9a14
10 changed files with 222 additions and 40 deletions

View File

@ -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

View File

@ -13,7 +13,7 @@
*
* ==OUT==
* @pListenSocket<int*> Pointeur sur le <int> à remplir => contiendra un pointeur sur la socket d'écoute
* @pAddr<sockaddr_in*> Pointeur sur le <sockaddr_n> à remplir => contiendra un pointeur sur les infos server
* @pInfo<sockaddr_in*> Pointeur sur le <sockaddr_n> à remplir => contiendra un pointeur sur les infos server
*
* ==RETURN==
* @status<int> -1 si erreur, sinon 0

View File

@ -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

View File

@ -7,8 +7,6 @@
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <time.h>
#include <math.h>
/* sys */
#include <sys/types.h>
@ -22,8 +20,8 @@
#include <arpa/inet.h>
/* 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

View File

@ -1 +1,42 @@
#include "client.h"
#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;
}

View File

@ -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<const char*> Adresse du serveur TCP
* @pPort<const int> Port du serveur TCP
*
* ==OUT==
* @pSocket<int*> Pointeur sur le <int> à remplir => contiendra un pointeur sur la socket créée
* @pInfo<sockaddr_in*> Pointeur sur le <sockaddr_In> à remplir => contiendra un pointeur sur les infos server
*
* ==RETURN==
* @status<int> -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

View File

@ -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;
}

View File

@ -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<const char*> Adresse du groupe multicast UDP
* @pPort<const int> Port d'écoute UDP
*
* ==OUT==
* @pSocket<int*> Pointeur sur le <int> à rempliR => contiendra un pointeur sur la socket créée
* @pInfo<sockaddr_in*> Pointeur sur le <sockaddr_In> à remplir => contiendra un pointeur sur les infos server
*
* ==RETURN==
* @status<int> -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

View File

@ -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
=========================================================*/
}
/********************************

View File

@ -1,8 +1,14 @@
#ifndef _PLANE_H_
#define _PLANE_H_
#include <time.h>
#include <math.h>
#include "lib/header.h"
#include "lib/network/udp/client.h"
#include "lib/network/tcp/client.h"
#define ALTMAX 20000