[done] Gestion com plane 2-sides : envoi des données - [todo] gestion tampon + update avec flags
This commit is contained in:
parent
e1e8d56d0c
commit
791ca5ab09
|
@ -52,7 +52,7 @@
|
|||
#define maxHostLen 64
|
||||
#define maxPortLen 6
|
||||
|
||||
#define SOCK_TIMEOUT 2 // 2sec timeout
|
||||
#define SOCK_TIMEOUT 3 // 3sec timeout (1+ temps refresh plane)
|
||||
|
||||
|
||||
struct context{
|
||||
|
|
|
@ -47,13 +47,14 @@ int multicastPlanes(struct middleware_arg* arg){
|
|||
|
||||
/* (1) Envoi socket de communication (TCP)
|
||||
---------------------------------------------------------*/
|
||||
/* 1. Si on veut un port de communicatin */
|
||||
if( request.flags&BINDHEAD_SCK ){
|
||||
/* 1. Si flag manquant -> on quitte */
|
||||
if( !(request.flags&BINDHEAD_TCP) )
|
||||
return -1;
|
||||
|
||||
strcpy(request.addr, SERV_HOST);
|
||||
request.port = TCP_LIST;
|
||||
|
||||
}
|
||||
|
||||
strcpy(request.addr, SERV_HOST);
|
||||
request.port = TCP_LIST;
|
||||
|
||||
/* [2] Envoi de la réponse
|
||||
=========================================================*/
|
||||
|
|
|
@ -32,6 +32,8 @@
|
|||
#define MCST_HOST "224.0.0.1" // adresse groupe multicast UDP
|
||||
#define MCST_PORT 4444 // port multicast UDP
|
||||
|
||||
#define SOCK_TIMEOUT 3
|
||||
|
||||
#define MAX_BUF_LEN 512
|
||||
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ int UDP_SOCKET(int* pSocket, const char* pAddr, const int pPort, struct sockaddr
|
|||
/* [0] Initialisation des variables
|
||||
=========================================================*/
|
||||
*pSocket = -1;
|
||||
struct timeval timeout;
|
||||
|
||||
|
||||
/* [1] Création de la socket
|
||||
|
@ -18,6 +19,15 @@ int UDP_SOCKET(int* pSocket, const char* pAddr, const int pPort, struct sockaddr
|
|||
if( *pSocket < 0 )
|
||||
return -1;
|
||||
|
||||
/* 3. Timeout */
|
||||
timeout.tv_sec = SOCK_TIMEOUT;
|
||||
timeout.tv_usec = 0;
|
||||
|
||||
if( setsockopt(*pSocket, SOL_SOCKET, SO_RCVTIMEO|SO_SNDTIMEO, (char*) &timeout, sizeof(struct timeval) ) < 0 ){
|
||||
close(*pSocket);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/* [2] On définit les infos de la socket
|
||||
=========================================================*/
|
||||
|
|
|
@ -29,10 +29,8 @@ int open_communication(){
|
|||
/* 0. Initialisation des variables */
|
||||
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;
|
||||
const int REQ_SIZE = sizeof(char)*INET_ADDRSTRLEN+sizeof(unsigned short);
|
||||
struct bind_header request;
|
||||
|
||||
/* [1] Socket Multicast UDP
|
||||
=========================================================*/
|
||||
|
@ -48,10 +46,15 @@ int open_communication(){
|
|||
---------------------------------------------------------*/
|
||||
/* 1. Construction séquence d'initialisation */
|
||||
// memcpy(buffer, numero_vol, sizeof(char)*6);
|
||||
strcpy(buffer, "\003000.000.000.000\x01\x00");
|
||||
request.flags = BINDHEAD_TCP;
|
||||
strcpy(request.addr, "000.000.000.000");
|
||||
request.port = 0;
|
||||
memcpy(buffer+sizeof(char)*0, &request.flags, sizeof(char));
|
||||
memcpy(buffer+sizeof(char)*1, &request.addr, sizeof(char)*INET_ADDRSTRLEN);
|
||||
memcpy(buffer+sizeof(char)*(1+INET_ADDRSTRLEN), &request.port, sizeof(unsigned short));
|
||||
|
||||
/* 2. Envoi séquence */
|
||||
if( sendto(mcast_socket, buffer, REQ_SIZE+1, 0, (struct sockaddr*) &udp, sizeof(struct sockaddr_in)) < 0 ){
|
||||
if( sendto(mcast_socket, buffer, BINDHDR_LEN/sizeof(char) +1, 0, (struct sockaddr*) &udp, sizeof(struct sockaddr_in)) < 0 ){
|
||||
close(mcast_socket);
|
||||
return 0;
|
||||
}
|
||||
|
@ -69,16 +72,19 @@ int open_communication(){
|
|||
}
|
||||
|
||||
/* 3. Vérification taille */
|
||||
if( status < REQ_SIZE ){
|
||||
if( status < BINDHDR_LEN ){
|
||||
close(mcast_socket);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* 4. On récupère les données */
|
||||
memcpy(serverAddr, buffer+sizeof(char), sizeof(char)*INET_ADDRSTRLEN );
|
||||
memcpy(&serverPort, buffer+sizeof(char)*(INET_ADDRSTRLEN+1), sizeof(unsigned short) );
|
||||
bzero(&request, sizeof(struct bind_header));
|
||||
|
||||
printf("bind_header{flags = %d; addr = %s; port = %d;}\n\n", (int) buffer[0], serverAddr, serverPort);
|
||||
memcpy(&request.addr, buffer, sizeof(char) );
|
||||
memcpy(&request.addr, buffer+sizeof(char), sizeof(char)*INET_ADDRSTRLEN );
|
||||
memcpy(&request.port, buffer+sizeof(char)*(1+INET_ADDRSTRLEN), sizeof(unsigned short) );
|
||||
|
||||
printf("bind_header{flags = %d; addr = %s; port = %d;}\n\n", request.flags, request.addr, request.port);
|
||||
|
||||
|
||||
|
||||
|
@ -91,7 +97,7 @@ int open_communication(){
|
|||
/* (1) Création socket TCP + connection
|
||||
---------------------------------------------------------*/
|
||||
/* 1. Création socket TCP + connection serveur */
|
||||
if( TCP_CONNECT(&commu_socket, serverAddr, serverPort, &tcp) < 0 )
|
||||
if( TCP_CONNECT(&commu_socket, request.addr, request.port, &tcp) < 0 )
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
|
@ -109,10 +115,46 @@ void send_data(){
|
|||
|
||||
/* [0] Initialisation des variables
|
||||
=========================================================*/
|
||||
char buffer[MAX_BUF_LEN] = {0};
|
||||
struct plane_data request;
|
||||
int read;
|
||||
|
||||
|
||||
/* [1] Envoi des caractéristiques
|
||||
=========================================================*/
|
||||
/* 1. Vérification socket */
|
||||
if( commu_socket < 0 )
|
||||
return;
|
||||
|
||||
/* 2. création objet */
|
||||
strcpy(request.code, numero_vol);
|
||||
request.x = crd.x;
|
||||
request.y = crd.y;
|
||||
request.z = crd.z;
|
||||
request.cap = ctrl.cap;
|
||||
request.spd = ctrl.speed;
|
||||
|
||||
/* 3. Copie buffer */
|
||||
strcpy(buffer, request.code);
|
||||
memcpy(buffer+sizeof(char)*0+sizeof(int)*0, &request.code, sizeof(char)*6 );
|
||||
memcpy(buffer+sizeof(char)*6+sizeof(int)*0, &request.x, sizeof(int) );
|
||||
memcpy(buffer+sizeof(char)*6+sizeof(int)*1, &request.y, sizeof(int) );
|
||||
memcpy(buffer+sizeof(char)*6+sizeof(int)*2, &request.z, sizeof(int) );
|
||||
memcpy(buffer+sizeof(char)*6+sizeof(int)*3, &request.cap, sizeof(int) );
|
||||
memcpy(buffer+sizeof(char)*6+sizeof(int)*4, &request.spd, sizeof(int) );
|
||||
|
||||
read = send(commu_socket, buffer, PLANE_DATA_LEN/sizeof(char) + 1, 0);
|
||||
|
||||
if( read < 0 ){
|
||||
printf("Erreur d'envoi\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* 4. Récupération réponse */
|
||||
//TODO: recv()
|
||||
|
||||
/* 5. Gestion mise à jour */
|
||||
//TODO: update_cap etc avec flags
|
||||
|
||||
}
|
||||
|
||||
|
@ -139,6 +181,9 @@ void init_plane(){
|
|||
// formée de 2 lettres puis 3 chiffres
|
||||
numero_vol[0] = (random() % 26) + 'A';
|
||||
numero_vol[1] = (random() % 26) + 'A';
|
||||
numero_vol[2] = (random() % 10) + '0';
|
||||
numero_vol[3] = (random() % 10) + '0';
|
||||
numero_vol[4] = (random() % 10) + '0';
|
||||
numero_vol[5] = 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -39,4 +39,25 @@
|
|||
int speed;
|
||||
};
|
||||
|
||||
#define PLANE_DATA_LEN (sizeof(char)*6+sizeof(int)*5)
|
||||
struct plane_data{
|
||||
char code[6];
|
||||
int x;
|
||||
int y;
|
||||
int z;
|
||||
int cap;
|
||||
int spd;
|
||||
};
|
||||
|
||||
#define BINDHDR_LEN ( sizeof(char)*(1+INET_ADDRSTRLEN)+sizeof(unsigned short) )
|
||||
#define BINDHEAD_CTL 0x01 // is command terminal (else: view terminal)
|
||||
#define BINDHEAD_SCK 0x02 // ask for com socket
|
||||
#define BINDHEAD_TCP 0x04 // ask TCP instead of UDP
|
||||
|
||||
struct bind_header{
|
||||
char flags;
|
||||
char addr[INET_ADDRSTRLEN];
|
||||
unsigned short port;
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue