[fixed] indianness sgca (plane viewTerm)

This commit is contained in:
xdrm-brackets 2017-04-26 13:10:35 +02:00
parent 80f0aa95f6
commit 3c241a2a95
1 changed files with 37 additions and 22 deletions

View File

@ -81,7 +81,7 @@ void* managePlane(void* THREADABLE_ARGS){
}
/* 3. On parse la requête*/
/* 3. On parse la requête (indianness: network order) */
memcpy(&data.code, buffer+sizeof(char)*0+sizeof(int)*0, sizeof(char)*6);
memcpy(&data.x, buffer+sizeof(char)*6+sizeof(int)*0, sizeof(int));
memcpy(&data.y, buffer+sizeof(char)*6+sizeof(int)*1, sizeof(int));
@ -89,6 +89,14 @@ void* managePlane(void* THREADABLE_ARGS){
memcpy(&data.spd, buffer+sizeof(char)*6+sizeof(int)*4, sizeof(int));
memcpy(&data.cap, buffer+sizeof(char)*6+sizeof(int)*3, sizeof(int));
/* 4. Gestion de l'indianness */
data.x = ntohl(data.x);
data.y = ntohl(data.y);
data.z = ntohl(data.z);
data.cap = ntohl(data.cap);
data.spd = ntohl(data.spd);
/* (3) Gestion de la requête -> enregistrement
---------------------------------------------------------*/
@ -119,7 +127,7 @@ void* managePlane(void* THREADABLE_ARGS){
/* 3. On copie les constantes */
memcpy(&arg->sgca->data[pindex], &data, sizeof(struct plane));
printf("{tcp_com}(%d) stored (%d)'%s': {x = %d; y = %d; z = %d; cap = %d; spd = %d}\n", index, pindex, arg->sgca->data[pindex].code, arg->sgca->data[pindex].x, arg->sgca->data[pindex].y, arg->sgca->data[pindex].z, arg->sgca->data[pindex].cap, arg->sgca->data[pindex].spd);
if( DEBUGMOD&COM ) printf("{tcp_com}(%d) stored (%d)'%s': {x = %d; y = %d; z = %d; cap = %d; spd = %d}\n", index, pindex, arg->sgca->data[pindex].code, arg->sgca->data[pindex].x, arg->sgca->data[pindex].y, arg->sgca->data[pindex].z, arg->sgca->data[pindex].cap, arg->sgca->data[pindex].spd);
@ -128,11 +136,11 @@ void* managePlane(void* THREADABLE_ARGS){
---------------------------------------------------------*/
/* 1. ACK data */
strcpy(data.code, arg->sgca->data[pindex].code);
data.x = arg->sgca->data[pindex].x;
data.y = arg->sgca->data[pindex].y;
data.z = arg->sgca->data[pindex].z;
data.cap = arg->sgca->data[pindex].cap;
data.spd = arg->sgca->data[pindex].spd;
data.x = htonl(arg->sgca->data[pindex].x);
data.y = htonl(arg->sgca->data[pindex].y);
data.z = htonl(arg->sgca->data[pindex].z);
data.cap = htonl(arg->sgca->data[pindex].cap);
data.spd = htonl(arg->sgca->data[pindex].spd);
/* 2. Vérification du FLAG (modifications) si requêtes d'update */
//TODO: Gestion arg->sgca->update[pindex].flags|UPD_SPEED etc.. pour ajout du flag+elements dans reponse
@ -211,7 +219,7 @@ void* manageViewTerm(void* THREADABLE_ARGS){
struct sockaddr_in clientInfo;
socklen_t len;
char loop = 1;
int count, /*to_send, */sent; // compteurs d'envoi
int count, last, sent; // compteurs d'envoi
int i, index = -1; // Compteurs globaux
char buffer[MAX_BUF_LEN]; // Buffer d'envoi
struct term_res request; // Requête
@ -245,41 +253,48 @@ void* manageViewTerm(void* THREADABLE_ARGS){
free(request.data);
request.data = malloc( request.n * sizeof(struct plane) + 1 );
/* 2. On récupère la liste des avions */
for( i = 0 ; i < request.n ; i++ )
memcpy(&request.data[i], &arg->sgca->data[i], sizeof(struct plane));
/* 2. On récupère la liste des avions (network byte order) */
for( i = 0 ; i < request.n ; i++ ){
memcpy(&request.data[i].code, &arg->sgca->data[i].code, sizeof(char)*6);
request.data[i].x = htonl( arg->sgca->data[i].x );
request.data[i].y = htonl( arg->sgca->data[i].y );
request.data[i].z = htonl( arg->sgca->data[i].z );
request.data[i].cap = htonl( arg->sgca->data[i].cap );
request.data[i].spd = htonl( arg->sgca->data[i].spd );
}
/* [3] Construction de la requête
=========================================================*/
/* 1. Initialisation du buffer */
bzero(buffer, MAX_BUF_LEN*sizeof(char));
count = 0;
/* 2. Copie des données globales */
memcpy(buffer+count, &request.flags, sizeof(char)); count += sizeof(char);
memcpy(buffer+count, &request.n, sizeof(char)); count += sizeof(char);
count = 0; last = sizeof(char); memcpy(buffer+count, &request.flags, last);
count += last; last = sizeof(char); memcpy(buffer+count, &request.n, last);
/* 3. Copie des données des avions */
for( i = 0 ; i < request.n ; i++ ){
memcpy(buffer+count, &request.data[i].code, sizeof(char)*6 ); count += sizeof(char)*6;
memcpy(buffer+count, &request.data[i].x, sizeof(int) ); count += sizeof(int);
memcpy(buffer+count, &request.data[i].y, sizeof(int) ); count += sizeof(int);
memcpy(buffer+count, &request.data[i].z, sizeof(int) ); count += sizeof(int);
memcpy(buffer+count, &request.data[i].cap, sizeof(int) ); count += sizeof(int);
memcpy(buffer+count, &request.data[i].spd, sizeof(int) ); count += sizeof(int);
count += last; last = sizeof(char)*6; memcpy(buffer+count, &request.data[i].code, last);
count += last; last = sizeof(int); memcpy(buffer+count, &request.data[i].x, last);
count += last; last = sizeof(int); memcpy(buffer+count, &request.data[i].y, last);
count += last; last = sizeof(int); memcpy(buffer+count, &request.data[i].z, last);
count += last; last = sizeof(int); memcpy(buffer+count, &request.data[i].cap, last);
count += last; last = sizeof(int); memcpy(buffer+count, &request.data[i].spd, last);
}
count += last;
/* [4] Envoi de la requête
=========================================================*/
/* 1. Gestion de l'envoi en plusieurs requêtes */
/* 2. Envoi */
len = sizeof(struct sockaddr_in);
sent = sendto(arg->socket, buffer, count/sizeof(char), 0, (struct sockaddr*) &clientInfo, len);
sent = sendto(arg->socket, buffer, count/sizeof(char) + 1, 0, (struct sockaddr*) &clientInfo, len);
/* 3. Gestion erreur */
if( sent <= 0 ){