Now viewTerm has an "infinite" buffer and delegates the data/buffer creation from context to local function (next step: use it also for ctrlTerm)

This commit is contained in:
xdrm-brackets 2017-04-28 16:32:20 +02:00
parent e6c2bbcfa6
commit cc78418a53
2 changed files with 159 additions and 109 deletions

View File

@ -206,10 +206,10 @@ void* manageViewTerm(void* THREADABLE_ARGS){
struct sockaddr_in clientInfo; struct sockaddr_in clientInfo;
socklen_t len; socklen_t len;
char loop = 1; char loop = 1;
int count, last, sent, nb; // compteurs d'envoi size_t buflen;
int sent; // compteurs d'envoi
int i, index = -1; // Compteurs globaux int i, index = -1; // Compteurs globaux
char buffer[MAX_BUF_LEN]; // Buffer d'envoi char* buffer = malloc(1); // Buffer d'envoi
struct term_res response; // Requête
/* 2. On récupère les arguments */ /* 2. On récupère les arguments */
struct handler_arg* arg = THREADABLE_ARGS; struct handler_arg* arg = THREADABLE_ARGS;
@ -233,67 +233,17 @@ void* manageViewTerm(void* THREADABLE_ARGS){
while( loop ){ while( loop ){
/* [2] Récupération des données /* [2] Récupération des données
=========================================================*/ =========================================================*/
/* 1. On initialise les variables utiles */ getPlaneData(&buffer, &buflen, arg->sgca);
response.flags = TERMREQ_FBK;
nb = arg->sgca->n;
response.n = 0; // nombre d'avions online
free(response.data);
response.data = malloc( nb * sizeof(struct plane) + 1 );
/* 2. On récupère la liste des avions (network byte order) */
for( i = 0 ; i < nb ; i++ ){
memcpy(&response.data[i].code, &arg->sgca->data[i].code, sizeof(char)*6);
response.data[i].x = htonl( arg->sgca->data[i].x );
response.data[i].y = htonl( arg->sgca->data[i].y );
response.data[i].z = htonl( arg->sgca->data[i].z );
response.data[i].cap = htonl( arg->sgca->data[i].cap );
response.data[i].spd = htonl( arg->sgca->data[i].spd );
response.data[i].online = arg->sgca->data[i].online;
// Incrément du compte si online
response.n += response.data[i].online;
}
/* [3] Construction de la requête /* [3] Envoi de la requête
=========================================================*/ =========================================================*/
/* 1. Initialisation du buffer */
bzero(buffer, MAX_BUF_LEN*sizeof(char));
/* 2. Copie des données globales */
count = 0; last = sizeof(char); memcpy(buffer+count, &response.flags, last);
count += last; last = sizeof(char); memcpy(buffer+count, &response.n, last);
/* 3. Copie des données des avions */
for( i = 0 ; i < nb ; i++ ){
// Ignore les avions offline
if( !response.data[i].online )
continue;
count += last; last = sizeof(char)*6; memcpy(buffer+count, &response.data[i].code, last);
count += last; last = sizeof(int); memcpy(buffer+count, &response.data[i].x, last);
count += last; last = sizeof(int); memcpy(buffer+count, &response.data[i].y, last);
count += last; last = sizeof(int); memcpy(buffer+count, &response.data[i].z, last);
count += last; last = sizeof(int); memcpy(buffer+count, &response.data[i].cap, last);
count += last; last = sizeof(int); memcpy(buffer+count, &response.data[i].spd, last);
}
count += last;
/* [4] Envoi de la requête
=========================================================*/
/* 1. Gestion de l'envoi en plusieurs requêtes */
/* 2. Envoi */ /* 2. Envoi */
len = sizeof(struct sockaddr_in); len = sizeof(struct sockaddr_in);
sent = sendto(arg->socket, buffer, count/sizeof(char) + 1, 0, (struct sockaddr*) &clientInfo, len); sent = sendto(arg->socket, buffer, buflen + 1, 0, (struct sockaddr*) &clientInfo, len);
/* 3. Gestion erreur */ /* 3. Gestion erreur */
if( sent <= 0 ){ if( sent <= 0 ){
@ -302,7 +252,7 @@ void* manageViewTerm(void* THREADABLE_ARGS){
} }
/* [5] Timeout /* [4] Timeout
=========================================================*/ =========================================================*/
sleep(PUBL_TIMEOUT); sleep(PUBL_TIMEOUT);
@ -315,8 +265,9 @@ void* manageViewTerm(void* THREADABLE_ARGS){
if( index != -1 ) if( index != -1 )
arg->activeManagers[index] = 0; arg->activeManagers[index] = 0;
/* 2. On ferme la socket */ /* 2. On ferme la socket + libère la mémoire */
close(arg->socket); close(arg->socket);
free(buffer);
/* 3. On arrête le THREAD */ /* 3. On arrête le THREAD */
@ -356,7 +307,7 @@ void* manageCtrlTerm(void* THREADABLE_ARGS){
/* 1. Initialisation des variables */ /* 1. Initialisation des variables */
struct sockaddr_in clientInfo; struct sockaddr_in clientInfo;
socklen_t len; socklen_t len;
char loop = 1; char loop = 1, update = 0;
int count, last, sent, nb; // compteurs d'envoi int count, last, sent, nb; // compteurs d'envoi
int i, index = -1; // Compteurs globaux int i, index = -1; // Compteurs globaux
int pindex; // index of the current plane int pindex; // index of the current plane
@ -395,6 +346,7 @@ void* manageCtrlTerm(void* THREADABLE_ARGS){
/* 2. Si erreur reception */ /* 2. Si erreur reception */
if( count < TERMREQ_LEN ){ if( count < TERMREQ_LEN ){
send(arg->socket, "0", sizeof(char)*2, 0);
if( DEBUGMOD&BUF ) printf("{udp_cterm}{com}(%d) Error receiving request\n", index); if( DEBUGMOD&BUF ) printf("{udp_cterm}{com}(%d) Error receiving request\n", index);
continue; continue;
} }
@ -417,23 +369,29 @@ void* manageCtrlTerm(void* THREADABLE_ARGS){
/* [3] Gestion de la requête /* [3] Gestion de la requête
=========================================================*/ =========================================================*/
/* 1. On vérifie qu'il y a bien un update demandé */ /* 1. On vérifie qu'il y a bien un update demandé (ou DATA) */
if( !( request.flags&TERMREQ_ALT || request.flags&TERMREQ_CAP || request.flags&TERMREQ_SPD ) ){ update = ( request.flags&TERMREQ_ALT || request.flags&TERMREQ_CAP || request.flags&TERMREQ_SPD );
printf("{udp_cterm}{com}(%d) No update requested, passing\n", index); if( !( update || request.flags&TERMREQ_FBK ) ){
send(arg->socket, "0", sizeof(char)*2, 0);
printf("{udp_cterm}{com}(%d) Invalid flag, passing\n", index);
continue; continue;
} }
if( update ){
/* 2. On regarde si on trouve l'avion */ /* 2. On regarde si on trouve l'avion */
for( i = 0 ; i < arg->sgca->n ; i++ ){ for( i = 0 ; i < arg->sgca->n ; i++ ){
// Si l'avion existe -> on passe à la suite // Si l'avion existe et online -> on passe à la suite
if( strcmp(arg->sgca->data[i].code, request.update.code) == 0 ){ if( strcmp(arg->sgca->data[i].code, request.update.code) == 0 && arg->sgca->data[i].online ){
pindex = i; pindex = i;
break; break;
} }
} }
/* 3. Si on a pas trouvé l'avion ou qu'il est déconnecté, on passe */ /* 3. Si on a pas trouvé l'avion ou qu'il est déconnecté, on passe */
if( pindex <= -1 || arg->sgca->socket[pindex] <= -1 ){ if( pindex <= -1 || arg->sgca->socket[pindex] <= -1 ){
printf("{udp_cterm}{com}(%d) Plane unknown or unreachable, passing\n", index); printf("{udp_cterm}{com}(%d) Plane unknown or unreachable, passing\n", index);
@ -462,6 +420,7 @@ void* manageCtrlTerm(void* THREADABLE_ARGS){
/* 1. Réception */ /* 1. Réception */
bzero(buffer, sizeof(char)*MAX_BUF_LEN); bzero(buffer, sizeof(char)*MAX_BUF_LEN);
if( recv(arg->sgca->socket[pindex], buffer, MAX_BUF_LEN, 0) <= 0 ){ if( recv(arg->sgca->socket[pindex], buffer, MAX_BUF_LEN, 0) <= 0 ){
send(arg->socket, "0", sizeof(char)*2, 0);
printf("{udp_cterm}{com}(%d) Cannot get response from plane\n", index); printf("{udp_cterm}{com}(%d) Cannot get response from plane\n", index);
continue; continue;
} }
@ -476,7 +435,18 @@ void* manageCtrlTerm(void* THREADABLE_ARGS){
if( !(buffer[0]&TERMREQ_SPD) && request.flags&TERMREQ_SPD ) if( !(buffer[0]&TERMREQ_SPD) && request.flags&TERMREQ_SPD )
request.flags -= TERMREQ_SPD; request.flags -= TERMREQ_SPD;
/* [5] Réponse au terminal }else{
/* [5] Données des avions
=========================================================*/
/* 1. Si TERMREQ_FBK, on récupère les données */
}
/* [6] Réponse au terminal
=========================================================*/ =========================================================*/
if( send(arg->socket, buffer, sizeof(char)*2, 0) < 0 ) if( send(arg->socket, buffer, sizeof(char)*2, 0) < 0 )
printf("{udp_cterm}{com}(%d) Cannot answer to terminal\n", index); printf("{udp_cterm}{com}(%d) Cannot answer to terminal\n", index);
@ -501,3 +471,82 @@ void* manageCtrlTerm(void* THREADABLE_ARGS){
void getPlaneData(char** pBuffer, size_t* pLen, struct context* pContext){
/* [1] Initialisation des variables
=========================================================*/
/* 1. Initialisation des variables */
int count, last, i, nb; // compteurs
struct term_res response; // Requête
/* [1] Récupération des données
=========================================================*/
/* 1. On initialise les variables utiles */
response.flags = TERMREQ_FBK;
nb = pContext->n;
response.n = 0; // nombre d'avions online
response.data = malloc( nb * sizeof(struct plane) + 1 );
/* 2. On récupère la liste des avions (network byte order) */
for( i = 0 ; i < nb ; i++ ){
memcpy(&response.data[i].code, &pContext->data[i].code, sizeof(char)*6);
response.data[i].x = htonl( pContext->data[i].x );
response.data[i].y = htonl( pContext->data[i].y );
response.data[i].z = htonl( pContext->data[i].z );
response.data[i].cap = htonl( pContext->data[i].cap );
response.data[i].spd = htonl( pContext->data[i].spd );
response.data[i].online = pContext->data[i].online;
// Incrément du compte si online
response.n += response.data[i].online;
}
/* [3] Construction de la requête
=========================================================*/
/* 1. Initialisation du buffer */
*pBuffer = realloc(*pBuffer, sizeof(char)*2 + PLANE_LEN * response.n + sizeof(char));
/* 2. Copie des données globales */
count = 0; last = sizeof(char); memcpy(*pBuffer+count, &response.flags, last);
count += last; last = sizeof(char); memcpy(*pBuffer+count, &response.n, last);
/* 3. Copie des données des avions */
for( i = 0 ; i < nb ; i++ ){
// Ignore les avions offline
if( !response.data[i].online )
continue;
count += last; last = sizeof(char)*6; memcpy(*pBuffer+count, &response.data[i].code, last);
count += last; last = sizeof(int); memcpy(*pBuffer+count, &response.data[i].x, last);
count += last; last = sizeof(int); memcpy(*pBuffer+count, &response.data[i].y, last);
count += last; last = sizeof(int); memcpy(*pBuffer+count, &response.data[i].z, last);
count += last; last = sizeof(int); memcpy(*pBuffer+count, &response.data[i].cap, last);
count += last; last = sizeof(int); memcpy(*pBuffer+count, &response.data[i].spd, last);
}
*pLen = (count+last) / sizeof(char);
free(response.data);
}

View File

@ -19,5 +19,6 @@
void* manageViewTerm(void* THREADABLE_ARGS); void* manageViewTerm(void* THREADABLE_ARGS);
void* manageCtrlTerm(void* THREADABLE_ARGS); void* manageCtrlTerm(void* THREADABLE_ARGS);
void getPlaneData(char** pBuffer, size_t* pLen, struct context* pContext);
#endif #endif