[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:
parent
61581e393d
commit
ab0fea9a14
|
@ -25,7 +25,8 @@
|
||||||
#include "data.h"
|
#include "data.h"
|
||||||
|
|
||||||
/* vars */
|
/* vars */
|
||||||
#define SRV_HOST "127.0.0.1"
|
#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 UDP_MCST 4444 // multicast UDP port for PLANES
|
||||||
#define TCP_LIST 0x504c // TCP plane command (PL = 8076)
|
#define TCP_LIST 0x504c // TCP plane command (PL = 8076)
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
*
|
*
|
||||||
* ==OUT==
|
* ==OUT==
|
||||||
* @pListenSocket<int*> Pointeur sur le <int> à remplir => contiendra un pointeur sur la socket d'écoute
|
* @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==
|
* ==RETURN==
|
||||||
* @status<int> -1 si erreur, sinon 0
|
* @status<int> -1 si erreur, sinon 0
|
||||||
|
|
|
@ -9,9 +9,13 @@ default: all
|
||||||
lib/network/tcp/client.o: lib/header.h lib/network/tcp/client.h lib/network/tcp/client.c
|
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
|
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
|
# Compiles the Plane
|
||||||
boot: lib/network/tcp/client.o plane.h plane.c
|
# -lm flag for math lib
|
||||||
gcc $(CFLAGS) -o boot lib/network/tcp/client.o plane.c -lm
|
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
|
# Run full compilation
|
||||||
|
|
|
@ -7,8 +7,6 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <time.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
/* sys */
|
/* sys */
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -22,8 +20,8 @@
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
/* vars */
|
/* vars */
|
||||||
#define SRV_HOST "127.0.0.1"
|
#define MCST_HOST "225.0.0.37" // adresse groupe multicast UDP
|
||||||
#define SRV_PORT 0x504c
|
#define MCST_PORT 0x504c // port multicast UDP
|
||||||
|
|
||||||
#define MAX_BUF_LEN 512
|
#define MAX_BUF_LEN 512
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
#endif
|
|
@ -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;
|
||||||
|
}
|
|
@ -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
|
|
@ -6,7 +6,8 @@ char numero_vol[6];
|
||||||
struct coord crd;
|
struct coord crd;
|
||||||
struct control ctrl;
|
struct control ctrl;
|
||||||
|
|
||||||
int clientsock = -1;
|
int mcast_socket = -1;
|
||||||
|
int commu_socket = -1;
|
||||||
char buffer[MAX_BUF_LEN] = {0};
|
char buffer[MAX_BUF_LEN] = {0};
|
||||||
|
|
||||||
/********************************
|
/********************************
|
||||||
|
@ -14,51 +15,91 @@ char buffer[MAX_BUF_LEN] = {0};
|
||||||
********************************/
|
********************************/
|
||||||
|
|
||||||
int open_communication(){
|
int open_communication(){
|
||||||
// fonction à implémenter qui permet d'entrer en communication via TCP
|
|
||||||
// avec le gestionnaire de vols
|
|
||||||
|
|
||||||
/* 0. Initialisation des variables */
|
/* 0. Initialisation des variables */
|
||||||
// struct hostent* host = NULL;
|
struct sockaddr_in udp, tcp; // données des sockets
|
||||||
struct sockaddr_in server;
|
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 */
|
/* [1] Socket Multicast UDP
|
||||||
if( clientsock < 0 )
|
=========================================================*/
|
||||||
|
|
||||||
|
|
||||||
|
/* (1) Création socket multicast
|
||||||
|
---------------------------------------------------------*/
|
||||||
|
if( UDP_SOCKET(&mcast_socket, MCST_HOST, MCST_PORT, &udp) < 0 )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* 2. Hostname Lookup */
|
|
||||||
// host = gethostbyname(SRV_HOST);
|
|
||||||
|
|
||||||
// /* 2bis. Gestion erreur */
|
/* (2) Envoi séquence initialisation avion
|
||||||
// if( host == NULL )
|
---------------------------------------------------------*/
|
||||||
// return 0;
|
/* 1. Construction séquence d'initialisation */
|
||||||
|
memcpy(buffer, numero_vol, sizeof(char)*6);
|
||||||
|
|
||||||
/* 3. Mise à jour des infos serveur */
|
/* 2. Envoi séquence */
|
||||||
bzero(&server, sizeof(struct sockaddr_in));
|
if( sendto(mcast_socket, buffer, MAX_BUF_LEN, 0, (struct sockaddr*) &udp, sizeof(struct sockaddr_in)) < 0 ){
|
||||||
server.sin_family = AF_INET;
|
close(mcast_socket);
|
||||||
server.sin_port = htons(SRV_PORT);
|
return 0;
|
||||||
server.sin_addr.s_addr = inet_addr(SRV_HOST);
|
}
|
||||||
|
|
||||||
// // On récupère l'adresse serveur du lookup
|
|
||||||
// memcpy(&server->sin_addr.s_addr, *(host->h_addr_list), host->h_length);
|
|
||||||
|
|
||||||
/* 4. Connection */
|
/* (3) Attente réponse SGCA -> adresse+port TCP
|
||||||
if( connect(clientsock, (struct sockaddr*) &server, sizeof(struct sockaddr_in)) < 0 )
|
---------------------------------------------------------*/
|
||||||
|
/* 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 0;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void fermer_communication(){
|
void fermer_communication(){
|
||||||
// fonction à implémenter qui permet de fermer la communication
|
// fonction à implémenter qui permet de fermer la communication
|
||||||
// avec le gestionnaire de vols
|
// avec le gestionnaire de vols
|
||||||
}
|
}
|
||||||
|
|
||||||
void envoyer_caracteristiques(){
|
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
|
||||||
|
=========================================================*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************
|
/********************************
|
||||||
|
|
|
@ -2,7 +2,13 @@
|
||||||
#define _PLANE_H_
|
#define _PLANE_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
#include "lib/header.h"
|
#include "lib/header.h"
|
||||||
|
#include "lib/network/udp/client.h"
|
||||||
|
#include "lib/network/tcp/client.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define ALTMAX 20000
|
#define ALTMAX 20000
|
||||||
|
|
Loading…
Reference in New Issue