diff --git a/central-manager/Makefile b/central-manager/Makefile index d4c9903..cea7001 100644 --- a/central-manager/Makefile +++ b/central-manager/Makefile @@ -12,12 +12,12 @@ lib/network/tcp/server.o: lib/header.h lib/network/tcp/server.h lib/network/tcp/ lib/network/udp/server.o: lib/header.h lib/network/udp/server.h lib/network/udp/server.c gcc $(CFLAGS) -c -o lib/network/udp/server.o lib/network/udp/server.c -lib/util.o: lib/util.h lib/util.c - gcc $(CFLAGS) -c -o lib/util.o lib/util.c +lib/network/format/serializer.o: lib/network/format/serializer.h lib/network/format/serializer.c + gcc $(CFLAGS) -c -o lib/network/format/serializer.o lib/network/format/serializer.c # Compiles the SGCA -boot: lib/network/tcp/server.o lib/network/udp/server.o lib/util.o central-manager.h central-manager.c - gcc $(CFLAGS) -o boot lib/network/udp/server.o lib/network/tcp/server.o lib/util.o central-manager.c +boot: lib/network/tcp/server.o lib/network/udp/server.o lib/network/format/serializer.o central-manager.h central-manager.c + gcc $(CFLAGS) -o boot lib/network/udp/server.o lib/network/tcp/server.o lib/network/format/serializer.o central-manager.c # Run full compilation diff --git a/central-manager/central-manager.c b/central-manager/central-manager.c index 3f065eb..7f188aa 100644 --- a/central-manager/central-manager.c +++ b/central-manager/central-manager.c @@ -5,15 +5,11 @@ * @argv : {0:program name} * * @history -* [0] Initialisation des variables -* [1] On démarre le SERVEUR TCP d'écoute globale -* [2] On démarre le SERVEUR UDP d'écoute globale -* repeat: -* [3] Attente d'une demande de connection TCP -> création d'un THREAD -* [4] Attente d'une demande de connection UDP -> création d'un THREAD -* si SIGINT: -* [3] On attends la fin de tous les THREADS -* [4] On ferme la SOCKET d'écoute globale +* [1] Lancement des THREADS d'écoute +* 1. On démarre le SERVEUR TCP d'écoute globale +* 2. On démarre le SERVEUR UDP d'écoute globale +* [2] On attends la fin de tous les THREADS +* [3] On ferme la SOCKET d'écoute globale * */ int main(int argc, char* argv[]){ @@ -35,13 +31,16 @@ int main(int argc, char* argv[]){ pthread_join(listenManagers[0], NULL); pthread_join(listenManagers[1], NULL); - /* [4] On ferme la SOCKET d'écoute globale + /* [3] On ferme la SOCKET d'écoute globale ==========================================================*/ printf("FERMETURE DE TOUTES LES CONNECTIONS!\n"); } + + + /* Attente de connection TCP * * @history @@ -136,6 +135,9 @@ void* LISTEN_TCP(){ + + + /* Attente de connection UDP * * @history @@ -262,7 +264,15 @@ void* managePlane(void* THREADABLE_SOCKET){ break; } - printf("\t\tRequest(%d bytes) : '%s'\n", read, request); + /* 3. On désérialise la requête*/ + + + printf("\t\tPLANE Request(%d bytes) : '%s'\n", read, request); + + /* [3] Gestion de la requête + =========================================================*/ + + }while( 0 ); diff --git a/central-manager/central-manager.h b/central-manager/central-manager.h index 4167999..cb5c96f 100644 --- a/central-manager/central-manager.h +++ b/central-manager/central-manager.h @@ -1,13 +1,11 @@ #include "lib/header.h" -#include "lib/plane/plane.h" - /* local dependencies */ -#include "lib/util.h" #include "lib/network/tcp/server.h" #include "lib/network/udp/server.h" +#include "lib/network/format/serializer.h" /* headers */ diff --git a/central-manager/lib/network/format/serializer.c b/central-manager/lib/network/format/serializer.c new file mode 100644 index 0000000..2074c3d --- /dev/null +++ b/central-manager/lib/network/format/serializer.c @@ -0,0 +1,64 @@ +#include "serializer.h" + + +int parse_plane_request(const char* pIn, struct plane_request* pOut){ + + /* 1. Check buffer length */ + if( strlen(pIn)*sizeof(char) != sizeof(struct plane_request) ) + return -1; + + /* 2. Parse buffer */ + memcpy(pOut, pIn, (size_t) sizeof(struct plane_request)); + return 0; + +} + + + + + + +int parse_viewterm_request(const char* pIn, struct vterm_request* pOut){ + + /* 1. Check buffer length */ + if( strlen(pIn)*sizeof(char) != sizeof(struct vterm_request) ) + return -1; + + /* 2. Parse buffer */ + memcpy(pOut, pIn, sizeof(struct vterm_request)); + return 0; + +} + + + + + + +int parse_ctrlterm_request(const char* pIn, struct cterm_request* pOut){ + + /* 1. Check buffer length */ + if( strlen(pIn)*sizeof(char) != sizeof(struct cterm_request) ) + return -1; + + /* 2. Parse buffer */ + memcpy(pOut, pIn, sizeof(struct cterm_request)); + return 0; + +} + + + + + +int serialize_term_response(const struct term_response* pIn, char* pOut, const size_t pSize){ + + /* 1. Check buffer length */ + if( sizeof(struct term_response) > pSize*sizeof(char) ) + return -1; + + /* 2. Serialize response into buffer */ + memcpy(pOut, pIn, sizeof(struct term_response)); + return 0; + +} diff --git a/central-manager/lib/network/format/serializer.h b/central-manager/lib/network/format/serializer.h index eb2f0c0..bf92b2c 100644 --- a/central-manager/lib/network/format/serializer.h +++ b/central-manager/lib/network/format/serializer.h @@ -1,11 +1,65 @@ #ifndef _LIB_NETWORK_FORMAT_SERIALIZER_H_ #define _LIB_NETWORK_FORMAT_SERIALIZER_H_ + #include + #include "../../plane/plane.h" - #include "../../header.h"; + struct plane_request{ // Plane Request + struct coord co; + struct control ct; + }; + struct vterm_request{ // ViewTerminal Request + char flags; + }; + struct term_response{ // Terminal-s Response + char flags; + struct coord co; + struct control ct; + }; + struct cterm_request{ // ControlTerminal Request + char flags; + int z; + struct control ct; + }; + + /* Parse a plane request ('char*' to 'struct plane_request') + * + * @history + * [1] Check if buffer have correct size (according to destination struct) + * [2] Parse buffer to struct + * + */ + int parse_plane_request(const char* pIn, struct plane_request* pOut); + + /* Parse a viewTerminal request ('char*' to 'struct vt_request') + * + * @history + * [1] Check if buffer have correct size (according to destination struct) + * [2] Parse buffer to struct + * + */ + int parse_viewterm_request(const char* pIn, struct vterm_request* pOut); + + /* Parse a ctrlTerminal request ('char*' to 'struct ct_request') + * + * @history + * [1] Check if buffer have correct size (according to destination struct) + * [2] Parse buffer to struct + * + */ + int parse_ctrlterm_request(const char* pIn, struct cterm_request* pOut); + + /* Serialize a Terminal response ('struct t_response' to 'char*') + * + * @history + * [1] Check if buffer have correct size (according to input struct) + * [2] Serialize struct into buffer + * + */ + int serialize_term_response(const struct term_response* pIn, char* pOut, const size_t pSize); #endif \ No newline at end of file diff --git a/central-manager/lib/plane/plane.c b/central-manager/lib/plane/plane.c deleted file mode 120000 index da5c61f..0000000 --- a/central-manager/lib/plane/plane.c +++ /dev/null @@ -1 +0,0 @@ -../../../global/plane.c \ No newline at end of file diff --git a/central-manager/lib/plane/plane.h b/central-manager/lib/plane/plane.h index 471786c..b90a92b 120000 --- a/central-manager/lib/plane/plane.h +++ b/central-manager/lib/plane/plane.h @@ -1 +1 @@ -../../../global/plane.h \ No newline at end of file +../../../plane/plane.h \ No newline at end of file diff --git a/central-manager/lib/util.c b/central-manager/lib/util.c deleted file mode 100644 index 859c32b..0000000 --- a/central-manager/lib/util.c +++ /dev/null @@ -1,104 +0,0 @@ -#include "util.h" - - -int swrite(int* pSocket, char* pBuffer){ - if( *pSocket == -1 ) return -1; // si SOCKET fermée, on retourne une erreur - if( strlen(pBuffer) == 0 ) return 0; // si on a rien à écrire, on n'écrit rien :p - - - /* 1. On écrit sur la SOCKET */ - if( DEBUGMOD&BUF ) printf("SENDLEN_1: %lu\n", strlen(pBuffer)); - int nbSent = write(*pSocket, pBuffer, strlen(pBuffer)); - if( DEBUGMOD&BUF ) printf("SENDLEN_2: %d\n", nbSent); - - /* 2. Si on est déconnecté, on retourne une erreur */ - if( nbSent <= 0 ){ - if( DEBUGMOD&BUF ) printf("NOTHING TO SEND\n"); - return -1; // on retourne une erreur - } - - if( DEBUGMOD&RVL ) printf("SEND_1\n"); - if( DEBUGMOD&RVL ) revealString(pBuffer); - if( DEBUGMOD&RVL ) printf("SEND_2\n"); - - - /* 3. On retourne le nombre de envoyés */ - return nbSent; -} - - -int sread(int* pSocket, char* pBuffer){ - if( *pSocket == -1 ) return -1; // si SOCKET fermée, on retourne une erreur - - - /* 1. On vide le buffer avant de lire */ - memset(pBuffer, '\0', MAX_BUF_LEN); - if( DEBUGMOD&BUF ) printf("READLEN_1: %lu\n", strlen(pBuffer)); - - /* 2. On lit la SOCKET */ - int nbRead = read(*pSocket, pBuffer, MAX_BUF_LEN); - if( DEBUGMOD&BUF ) printf("READLEN_3: %d\n", nbRead); - - - /* 3. Si on est déconnecté, on retourne une erreur */ - if( nbRead <= 0 ){ - if( DEBUGMOD&BUF ) printf("NOTHING TO READ\n"); - return -1; // on retourne une erreur - } - - if( DEBUGMOD&RVL ) printf("READ_1\n"); - if( DEBUGMOD&RVL ) revealString(pBuffer); - if( DEBUGMOD&RVL ) printf("READ_2\n"); - - /* 4. On retourne le nombre de caractères lus */ - return nbRead; -} - - -void setSocketTimeout(int* pSocket, const int pSec, const int pUSec){ - /* 1. On créé la structure contenant le timeout */ - struct timeval timeout; - timeout.tv_sec = pSec; - timeout.tv_usec = pUSec; - - setsockopt(*pSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(struct timeval)); - - if( DEBUGMOD&SCK ) printf("Set socket(%d) timeout to %lus\n", *pSocket, (long unsigned) timeout.tv_sec ); -} - - -void xPrint(char* pPattern, char* pBuffer){ - char tmpBuffer[MAX_BUF_LEN]; - strcpy(tmpBuffer, pBuffer); - - - int i; - - // on supprimes les retours à la ligne de la fin - for( i = strlen(tmpBuffer)-1 ; i >= 0 && tmpBuffer[i] != '\0' ; i-- ) - if( tmpBuffer[i] == '\n' || tmpBuffer[i] == '\r' ) // si c'est un retour chariot - tmpBuffer[i] = '\0'; // on efface - else - break; - - printf(pPattern, pBuffer); -} - - -void revealString(char* pString){ - /* 1. On créé une copie de @pString */ - char revealedString[MAX_BUF_LEN] = {0}; - - /* 2. On rend visible tous les caractères "invisibles" */ - int i; - for( i = 0 ; i < strlen(pString) && pString[i] != '\0' ; i++ ){ - if( pString[i] == '\r' ){ revealedString[strlen(revealedString)] = '\\'; revealedString[strlen(revealedString)] = 'r'; } - else if( pString[i] == '\n' ){ revealedString[strlen(revealedString)] = '\\'; revealedString[strlen(revealedString)] = 'n'; } - else revealedString[strlen(revealedString)] = pString[i]; - - revealedString[strlen(revealedString)] = '\0'; - } - - /* 3. On affiche la chaîne explicite */ - if( DEBUGMOD&RVL ) printf("[[%s]]\n", revealedString); -} \ No newline at end of file diff --git a/central-manager/lib/util.h b/central-manager/lib/util.h deleted file mode 100644 index 4213925..0000000 --- a/central-manager/lib/util.h +++ /dev/null @@ -1,29 +0,0 @@ -#include "header.h" - -void setSocketTimeout(int* pSocket, const int pSec, const int pUSec); - - -/* read/write socket */ -int swrite(int* pSocket, char* pBuffer); -int sread(int* pSocket, char* pBuffer); - - - -/* Affiche une string en supprimant les retours à la ligne de fin de chaînes -* -* @pPattern Schéma du print (1er arg) -* @pBuffer Buffer en question -* -*/ -void xPrint(char* pPattern, char* pBuffer); - - -/* Révèle les caractères spéciaux d'une string -* -* @pString La string à révéler -* -* -* @print explicitString On affiche la chaîne explicité -* -*/ -void revealString(char* pString); \ No newline at end of file diff --git a/global/plane.c b/global/plane.c deleted file mode 100644 index a2b10f3..0000000 --- a/global/plane.c +++ /dev/null @@ -1,167 +0,0 @@ -#include - -#include "avion.h" - -// caractéristiques du déplacement de l'avion -struct deplacement dep; - -// coordonnées spatiales de l'avion -struct coordonnees coord; - -// numéro de vol de l'avion : code sur 5 caractères -char numero_vol[6]; - -/******************************** - *** 3 fonctions à implémenter - ********************************/ - -int ouvrir_communication() -{ - // fonction à implémenter qui permet d'entrer en communication via TCP - // avec le gestionnaire de vols - 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'avion au gestionnaire de vols -} - -/******************************** - *** Fonctions gérant le déplacement de l'avion : ne pas modifier - ********************************/ - -// initialise aléatoirement les paramètres initiaux de l'avion -void initialiser_avion() -{ - // initialisation aléatoire du compteur aléatoire - int seed; - time(&seed); - srandom(seed); - - // intialisation des paramètres de l'avion - coord.x = 1000 + random() % 1000; - coord.y = 1000 + random() % 1000; - coord.altitude = 900 + random() % 100; - - dep.cap = random() % 360; - dep.vitesse = 600 + random() % 200; - - // initialisation du numero de l'avion : chaine de 5 caractères - // formée de 2 lettres puis 3 chiffres - numero_vol[0] = (random() % 26) + 'A'; - numero_vol[1] = (random() % 26) + 'A'; - sprintf (&numero_vol[2], "%03d", (random() % 999) + 1); - numero_vol[5] = 0; -} - -// modifie la valeur de l'avion avec la valeur passée en paramètre -void changer_vitesse(int vitesse) -{ - if (vitesse < 0) - dep.vitesse = 0; - else if (vitesse > VITMAX) - dep.vitesse = VITMAX; - else dep.vitesse = vitesse; -} - -// modifie le cap de l'avion avec la valeur passée en paramètre -void changer_cap(int cap) -{ - if ((cap >= 0) && (cap < 360)) - dep.cap = cap; -} - -// modifie l'altitude de l'avion avec la valeur passée en paramètre -void changer_altitude(int alt) -{ - if (alt < 0) - coord.altitude = 0; - else if (alt > ALTMAX) - coord.altitude = ALTMAX; - else coord.altitude = alt; -} - -// affiche les caractéristiques courantes de l'avion -void afficher_donnees() -{ - printf("Avion %s -> localisation : (%d,%d), altitude : %d, vitesse : %d, cap : %d\n", - numero_vol, coord.x, coord.y, coord.altitude, dep.vitesse, dep.cap); -} - -// recalcule la localisation de l'avion en fonction de sa vitesse et de son cap -void calcul_deplacement() -{ - float cosinus, sinus; - float dep_x, dep_y; - int nb; - - if (dep.vitesse < VITMIN) - { - printf("Vitesse trop faible : crash de l'avion\n"); - fermer_communication(); - exit(2); - } - if (coord.altitude == 0) - { - printf("L'avion s'est ecrase au sol\n"); - fermer_communication(); - exit(3); - } - - cosinus = cos(dep.cap * 2 * M_PI / 360); - sinus = sin(dep.cap * 2 * M_PI / 360); - - dep_x = cos(dep.cap * 2 * M_PI / 360) * dep.vitesse * 10 / VITMIN; - dep_y = sin(dep.cap * 2 * M_PI / 360) * dep.vitesse * 10 / VITMIN; - - // on se déplace d'au moins une case quels que soient le cap et la vitesse - // sauf si cap est un des angles droit - if ((dep_x > 0) && (dep_x < 1)) dep_x = 1; - if ((dep_x < 0) && (dep_x > -1)) dep_x = -1; - - if ((dep_y > 0) && (dep_y < 1)) dep_y = 1; - if ((dep_y < 0) && (dep_y > -1)) dep_y = -1; - - //printf(" x : %f y : %f\n", dep_x, dep_y); - - coord.x = coord.x + (int)dep_x; - coord.y = coord.y + (int)dep_y; - - afficher_donnees(); -} - -// fonction principale : gère l'exécution de l'avion au fil du temps -void se_deplacer() -{ - while(1) - { - sleep(PAUSE); - calcul_deplacement(); - envoyer_caracteristiques(); - } -} - -int main() -{ - // on initialise l'avion - initialiser_avion(); - - afficher_donnees(); - // on quitte si on arrive à pas contacter le gestionnaire de vols - if (!ouvrir_communication()) - { - printf("Impossible de contacter le gestionnaire de vols\n"); - exit(1); - } - - // on se déplace une fois toutes les initialisations faites - se_deplacer(); -} diff --git a/global/plane.h b/global/plane.h deleted file mode 100644 index 678021b..0000000 --- a/global/plane.h +++ /dev/null @@ -1,18 +0,0 @@ -#define ALTMAX 20000 -#define ALTMIN 0 - -#define VITMAX 1000 -#define VITMIN 200 - -#define PAUSE 2 - -struct coordonnees { - int x; - int y; - int altitude; -}; - -struct deplacement { - int cap; - int vitesse; -}; \ No newline at end of file diff --git a/plane/Makefile b/plane/Makefile new file mode 100644 index 0000000..df9b1c1 --- /dev/null +++ b/plane/Makefile @@ -0,0 +1,26 @@ +CFLAGS=-Wall + +# Runs 'all' depenency as default / i.e. 'make' command will run 'make all' implicitly +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/format/serializer.o: lib/network/format/serializer.h lib/network/format/serializer.c + gcc $(CFLAGS) -c -o lib/network/format/serializer.o lib/network/format/serializer.c + +# Compiles the Plane +boot: lib/network/tcp/client.o lib/network/format/serializer.o plane.h plane.c + gcc $(CFLAGS) -o boot lib/network/tcp/client.o lib/network/format/serializer.o plane.c -lm + + +# Run full compilation +all: boot + +# cleans the compiled files +clean: + rm boot; + rm ./**/*.o diff --git a/plane/dep/client.c b/plane/dep/client.c deleted file mode 100644 index 52c2c78..0000000 --- a/plane/dep/client.c +++ /dev/null @@ -1,500 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - xdrm-brackets/proxy.ftp.c - xdrm-brackets' git server - - - - - - -
- - - -
-
-
-
- -
-
-
-
- - - -
- - -
- - - - -

- No Description - -

- - -
-

- - - client.c 3.9KB - - -
-
- - Permalink - - History - Raw -
- - - - - - - - -
- -

-
-
- - - - - - - - - - -
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include "client.h"
  2. -
  3. -
  4. -
  5. int CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket){
  6. -
  7. if( DEBUGMOD&HDR ) printf("====== CONNECT_CLIENT(%s, %s, %d) ======\n\n", serverHost, serverPort, *pSocket);
  8. -
  9. -
  10. struct addrinfo hints; // contiendra le filtre/format
  11. -
  12. struct addrinfo* addrinfo; // contiendra les infos
  13. -
  14. int CONNECT; // file_desc(s)
  15. -
  16. int GETADDRINFO; // contiendra l'erreur ou pas de getaddrinfo()
  17. -
  18. char BUFFER[MAX_BUF_LEN]; // BUFFER de communication
  19. -
  20. -
  21. /* [1] On définit le filtre/format
  22. -
  23. =======================================================*/
  24. -
  25. memset(&hints, 0, sizeof(struct addrinfo)); // on vide le filtre
  26. -
  27. hints.ai_family = AF_UNSPEC; // Allow IPv4 ou IPv6
  28. -
  29. hints.ai_socktype = SOCK_STREAM; // TCP (SOCK_DGRAM = UDP)
  30. -
  31. hints.ai_flags = 0; // non spécifié
  32. -
  33. hints.ai_protocol = 0; // non spécifié
  34. -
  35. -
  36. if( DEBUGMOD&SCK ) printf("============HINTS===========\n");
  37. -
  38. if( DEBUGMOD&SCK ) printf( "AI_FLAGS = %d\n", hints.ai_flags ); // int
  39. -
  40. if( DEBUGMOD&SCK ) printf( "AI_FAMILY = %d\n", hints.ai_family ); // int
  41. -
  42. if( DEBUGMOD&SCK ) printf( "AI_SOCKTYPE = %d\n", hints.ai_socktype ); // int
  43. -
  44. if( DEBUGMOD&SCK ) printf( "AI_PROTOCOL = %d\n", hints.ai_protocol ); // int
  45. -
  46. if( DEBUGMOD&SCK ) printf( "AI_ADDRLEN = %d\n", hints.ai_addrlen ); // int
  47. -
  48. if( DEBUGMOD&SCK ) printf("\n");
  49. -
  50. -
  51. -
  52. /* [2] On récupère les infos
  53. -
  54. =======================================================*/
  55. -
  56. GETADDRINFO = getaddrinfo(serverHost, serverPort, &hints, &addrinfo);
  57. -
  58. -
  59. // si erreur
  60. -
  61. if( GETADDRINFO < 0 ) return -1;
  62. -
  63. -
  64. if( DEBUGMOD&SCK ) printf("=============RES============\n");
  65. -
  66. if( DEBUGMOD&SCK ) printf( "AI_FLAGS = %d\n", addrinfo->ai_flags ); // int
  67. -
  68. if( DEBUGMOD&SCK ) printf( "AI_FAMILY = %d\n", addrinfo->ai_family ); // int
  69. -
  70. if( DEBUGMOD&SCK ) printf( "AI_SOCKTYPE = %d\n", addrinfo->ai_socktype ); // int
  71. -
  72. if( DEBUGMOD&SCK ) printf( "AI_PROTOCOL = %d\n", addrinfo->ai_protocol ); // int
  73. -
  74. if( DEBUGMOD&SCK ) printf( "AI_ADDRLEN = %d\n", addrinfo->ai_addrlen ); // int
  75. -
  76. if( DEBUGMOD&SCK ) printf("\n");
  77. -
  78. -
  79. /* [3] Création de la socket
  80. -
  81. =======================================================*/
  82. -
  83. *pSocket = socket(addrinfo->ai_family, addrinfo->ai_socktype, 0);
  84. -
  85. -
  86. if( DEBUGMOD&SCK ) printf("SOCKET = %d\n", *pSocket);
  87. -
  88. -
  89. // si erreur
  90. -
  91. if( *pSocket == -1 ) return -1;
  92. -
  93. -
  94. -
  95. /* [4] On établit la connection
  96. -
  97. =======================================================*/
  98. -
  99. CONNECT = connect(
  100. -
  101. *pSocket,
  102. -
  103. addrinfo->ai_addr,
  104. -
  105. addrinfo->ai_addrlen
  106. -
  107. );
  108. -
  109. -
  110. if( DEBUGMOD&SCK ) printf("CONNECT = %d\n", CONNECT);
  111. -
  112. -
  113. // si erreur
  114. -
  115. if( CONNECT == -1 ) return -1;
  116. -
  117. -
  118. // on a plus besoin des infos de l'adresse
  119. -
  120. freeaddrinfo(addrinfo);
  121. -
  122. -
  123. -
  124. /* [5] On retourne la SOCKET
  125. -
  126. =======================================================*/
  127. -
  128. return *pSocket;
  129. -
  130. }
  131. -
  132. -
  133. -
  134. -
  135. -
  136. -
  137. -
  138. int CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer){
  139. -
  140. if( DEBUGMOD&HDR ) printf("====== CLIENT_SEND(%d, %s, %s) ======\n\n", *pSocket, pRequest, *pAnswer);
  141. -
  142. char BUFFER[MAX_BUF_LEN] = {0};
  143. -
  144. -
  145. /* [1] On écrit sur la socket
  146. -
  147. =======================================================*/
  148. -
  149. int nbSend = swrite(pSocket, pRequest);
  150. -
  151. -
  152. if( DEBUGMOD&BUF ) printf("nbSend: %d\n", nbSend);
  153. -
  154. if( DEBUGMOD&BUF ) printf("Message: %s\n", pRequest);
  155. -
  156. -
  157. // si pas tout envoyé
  158. -
  159. if( strlen(pRequest) != nbSend ) return -1;
  160. -
  161. -
  162. /* [2] On attends et lit la réponse
  163. -
  164. =======================================================*/
  165. -
  166. int nbRecup = WAIT_SOCKET_UPDATE(pSocket, BUFFER);
  167. -
  168. -
  169. /* [3] On retourne la réponse par référence
  170. -
  171. =======================================================*/
  172. -
  173. *pAnswer = malloc( MAX_BUF_LEN );
  174. -
  175. strcpy(*pAnswer, BUFFER);
  176. -
  177. -
  178. if( DEBUGMOD&BUF ) printf("nbReceived: %d\n", nbRecup);
  179. -
  180. if( DEBUGMOD&BUF ) printf("Message: %s\n", *pAnswer);
  181. -
  182. }
  183. -
- -
-
-
- - - - -
-
- -
- - - - - - - - - - - - - - - - - diff --git a/plane/dep/client.h b/plane/dep/client.h deleted file mode 100644 index e1b95a4..0000000 --- a/plane/dep/client.h +++ /dev/null @@ -1,433 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - xdrm-brackets/proxy.ftp.c - xdrm-brackets' git server - - - - - - -
- - - -
-
-
-
- -
-
-
-
- - - -
- - -
- - - - -

- No Description - -

- - -
-

- - - client.h 1.0KB - - -
-
- - Permalink - - History - Raw -
- - - - - - - - -
- -

-
-
- - - - - - - - - - -
12345678910111213141516171819202122232425262728293031323334353637383940
  1. /* Envoi d'une requête à un serveur et réception de la réponse
  2. -
  3. *
  4. -
  5. * @serverHost<char*> Nom de l'hôte distant (server)
  6. -
  7. * @serverPort<char*> Numéro du port distant (server)
  8. -
  9. * @pSocket<int*> Pointeur sur la requête à créer
  10. -
  11. *
  12. -
  13. *
  14. -
  15. * @return error<int> retourne -1 en cas d'erreur, sinon la SOCKET
  16. -
  17. *
  18. -
  19. *
  20. -
  21. *
  22. -
  23. * @history
  24. -
  25. * [1] On définit le filtre/format
  26. -
  27. * [2] On récupère les infos
  28. -
  29. * [3] Création de la socket
  30. -
  31. * [4] On établit la connection
  32. -
  33. * [5] On retourne la SOCKET
  34. -
  35. *
  36. -
  37. */
  38. -
  39. int CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket);
  40. -
  41. -
  42. -
  43. -
  44. /* Envoi d'une requête vers une SOCKET et récupère la réponse
  45. -
  46. *
  47. -
  48. * @pSocket<int*> Pointeur sur la SOCKET en question
  49. -
  50. * @pRequest<char*> Requête à lui envoyer (swrite)
  51. -
  52. * @pAnswer<char**> Réponse qui se lira après la requête (sread)
  53. -
  54. *
  55. -
  56. * @return error<int> Retourne -1 en cas d'erreur
  57. -
  58. *
  59. -
  60. *
  61. -
  62. *
  63. -
  64. * @history
  65. -
  66. * [1] On écrit sur la socket
  67. -
  68. * [2] On attends et lit la réponse
  69. -
  70. * [3] On retourne la réponse par référence
  71. -
  72. *
  73. -
  74. */
  75. -
  76. int CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer);
  77. -
- -
-
-
- - - - -
-
- -
- - - - - - - - - - - - - - - - - diff --git a/plane/dep/utility.c b/plane/dep/utility.c deleted file mode 100644 index c60f906..0000000 --- a/plane/dep/utility.c +++ /dev/null @@ -1,169 +0,0 @@ -#include "utility.h" - -void splitFtpRequest(char* pRequest, char* pCommand, char* pContent){ - /* [1] Vérification du format - ===========================================*/ - int firstSpaceIndex = indexOf(pRequest, ' '); - - if( firstSpaceIndex != 3 && firstSpaceIndex != 4){ // contient aucun espace en position 3 ou 4, on quitte - strcpy(pCommand, "ERROR"); - strcpy(pContent, ""); - return; - } - - - /* [2] Séparation des 2 parties - ===========================================*/ - int i; - - for( i = 0 ; i < strlen(pRequest) && pRequest[i] != '\0' ; i++ ){ - - if( i < firstSpaceIndex ) // première partie (pCommand) - strcat( pCommand, (char[2]){(char) pRequest[i], '\0'}); - if( i > firstSpaceIndex ) // seconde partie (pContent) - strcat( pContent, (char[2]){(char) pRequest[i], '\0'}); - } - - -} - - - - -void splitFtpResponse(char* pAnswer, char* ftpCode, char* ftpText){ - /* [1] Vérification du format - ===========================================*/ - int codeLength = 3; // taille du code - - /* [2] Séparation des 2 parties - ===========================================*/ - int i; - - for( i = 0 ; i < strlen(pAnswer) && pAnswer[i] != '\0' ; i++ ){ - - if( i < codeLength ) // première partie (ftpCode) - strcat(ftpCode, (char[2]){(char)pAnswer[i], '\0' }); - if( i > codeLength ) // seconde partie (ftpText) - strcat(ftpText, (char[2]){(char)pAnswer[i], '\0' }); - } - - -} - - - - - -int indexOf(char* haystack, char needle){ - int i; - - for( i = 0 ; i < strlen(haystack) && haystack[i] != '\0' ; i++ ) - if( haystack[i] == needle ) // si on trouve le caractère - return i; - - return -1; - -} - - -int swrite(int* pSocket, char* pBuffer){ - if( *pSocket == -1 ) return -1; // si SOCKET fermée, on retourne une erreur - if( strlen(pBuffer) == 0 ) return 0; // si on a rien à écrire, on n'écrit rien :p - - - /* 1. On écrit sur la SOCKET */ - if( DEBUGMOD&BUF ) printf("SENDLEN_1: %lu\n", strlen(pBuffer)); - int nbSent = write(*pSocket, pBuffer, strlen(pBuffer)); - if( DEBUGMOD&BUF ) printf("SENDLEN_2: %d\n", nbSent); - - /* 2. Si on est déconnecté, on retourne une erreur */ - if( nbSent <= 0 ){ - if( DEBUGMOD&BUF ) printf("NOTHING TO SEND\n"); - return -1; // on retourne une erreur - } - - if( DEBUGMOD&RVL ) printf("SEND_1\n"); - if( DEBUGMOD&RVL ) revealString(pBuffer); - if( DEBUGMOD&RVL ) printf("SEND_2\n"); - - - /* 3. On retourne le nombre de envoyés */ - return nbSent; -} - - -int sread(int* pSocket, char* pBuffer){ - if( *pSocket == -1 ) return -1; // si SOCKET fermée, on retourne une erreur - - - /* 1. On vide le buffer avant de lire */ - memset(pBuffer, '\0', MAX_BUF_LEN); - if( DEBUGMOD&BUF ) printf("READLEN_1: %lu\n", strlen(pBuffer)); - - /* 2. On lit la SOCKET */ - int nbRead = read(*pSocket, pBuffer, MAX_BUF_LEN); - if( DEBUGMOD&BUF ) printf("READLEN_3: %d\n", nbRead); - - - /* 3. Si on est déconnecté, on retourne une erreur */ - if( nbRead <= 0 ){ - if( DEBUGMOD&BUF ) printf("NOTHING TO READ\n"); - return -1; // on retourne une erreur - } - - if( DEBUGMOD&RVL ) printf("READ_1\n"); - if( DEBUGMOD&RVL ) revealString(pBuffer); - if( DEBUGMOD&RVL ) printf("READ_2\n"); - - /* 4. On retourne le nombre de caractères lus */ - return nbRead; -} - - -void setSocketTimeout(int* pSocket, const int pSec, const int pUSec){ - /* 1. On créé la structure contenant le timeout */ - struct timeval timeout; - timeout.tv_sec = pSec; - timeout.tv_usec = pUSec; - - setsockopt(*pSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(struct timeval)); - - if( DEBUGMOD&SCK ) printf("Set socket(%d) timeout to %lus\n", *pSocket, (long unsigned) timeout.tv_sec ); -} - - -void xPrint(char* pPattern, char* pBuffer){ - char tmpBuffer[MAX_BUF_LEN]; - strcpy(tmpBuffer, pBuffer); - - - int i; - - // on supprimes les retours à la ligne de la fin - for( i = strlen(tmpBuffer)-1 ; i >= 0 && tmpBuffer[i] != '\0' ; i-- ) - if( tmpBuffer[i] == '\n' || tmpBuffer[i] == '\r' ) // si c'est un retour chariot - tmpBuffer[i] = '\0'; // on efface - else - break; - - printf(pPattern, pBuffer); -} - - -void revealString(char* pString){ - /* 1. On créé une copie de @pString */ - char revealedString[MAX_BUF_LEN] = {0}; - - /* 2. On rend visible tous les caractères "invisibles" */ - int i; - for( i = 0 ; i < strlen(pString) && pString[i] != '\0' ; i++ ){ - if( pString[i] == '\r' ){ revealedString[strlen(revealedString)] = '\\'; revealedString[strlen(revealedString)] = 'r'; } - else if( pString[i] == '\n' ){ revealedString[strlen(revealedString)] = '\\'; revealedString[strlen(revealedString)] = 'n'; } - else revealedString[strlen(revealedString)] = pString[i]; - - revealedString[strlen(revealedString)] = '\0'; - } - - /* 3. On affiche la chaîne explicite */ - if( DEBUGMOD&RVL ) printf("[[%s]]\n", revealedString); -} \ No newline at end of file diff --git a/plane/dep/utility.h b/plane/dep/utility.h deleted file mode 100644 index b6ef223..0000000 --- a/plane/dep/utility.h +++ /dev/null @@ -1,60 +0,0 @@ -/* Découpe la requête FTP en 2 parties -* -* @pRequest La requête en question -* -* @pCommand Remplissage: commande (1ère partie) -* @pContant Remplissage: contenu (2ème partie) -* -* -*/ -void splitFtpRequest(char* pRequest, char* pCommand, char* pContent); - -/* Découpe la réponse FTP en 2 parties -* -* @pAnswer La réponse en question -* -* @ftpCode Remplissage: code FTP (1ère partie) -* @ftpText Remplissage: text associé (2ème partie) -* -* -*/ -void splitFtpResponse(char* pAnswer, char* ftpCode, char* ftpText); - - -/* Retourne le rang d'un caractère dans une string -* -* @haystack La chaîne dans laquelle rechercher -* @needle Le caractère recherché -* -* @return position Retourne l'index de @needle dans @haystack ou -1 si ne trouve pas -* -*/ -int indexOf(char* haystack, char needle); - -void setSocketTimeout(int* pSocket, const int pSec, const int pUSec); - - -/* read/write socket */ -int swrite(int* pSocket, char* pBuffer); -int sread(int* pSocket, char* pBuffer); - - - -/* Affiche une string en supprimant les retours à la ligne de fin de chaînes -* -* @pPattern Schéma du print (1er arg) -* @pBuffer Buffer en question -* -*/ -void xPrint(char* pPattern, char* pBuffer); - - -/* Révèle les caractères spéciaux d'une string -* -* @pString La string à révéler -* -* -* @print explicitString On affiche la chaîne explicité -* -*/ -void revealString(char* pString); \ No newline at end of file diff --git a/plane/lib/header.h b/plane/lib/header.h new file mode 100644 index 0000000..1f6a209 --- /dev/null +++ b/plane/lib/header.h @@ -0,0 +1,31 @@ +#ifndef _LIB_HEADER_H_ + #define _LIB_HEADER_H_ + + + /* global */ + #include + #include + #include + #include + #include + #include + + /* sys */ + #include + #include + + + /* socket */ + #include // close + #include + #include // getaddrinfo, getnameinfo + #include + + /* vars */ + #define SRV_HOST "localhost" + #define SRV_PORT 4444 + + #define MAX_BUF_LEN 512 + + +#endif \ No newline at end of file diff --git a/plane/lib/network/format/serializer.c b/plane/lib/network/format/serializer.c new file mode 100644 index 0000000..2074c3d --- /dev/null +++ b/plane/lib/network/format/serializer.c @@ -0,0 +1,64 @@ +#include "serializer.h" + + +int parse_plane_request(const char* pIn, struct plane_request* pOut){ + + /* 1. Check buffer length */ + if( strlen(pIn)*sizeof(char) != sizeof(struct plane_request) ) + return -1; + + /* 2. Parse buffer */ + memcpy(pOut, pIn, (size_t) sizeof(struct plane_request)); + return 0; + +} + + + + + + +int parse_viewterm_request(const char* pIn, struct vterm_request* pOut){ + + /* 1. Check buffer length */ + if( strlen(pIn)*sizeof(char) != sizeof(struct vterm_request) ) + return -1; + + /* 2. Parse buffer */ + memcpy(pOut, pIn, sizeof(struct vterm_request)); + return 0; + +} + + + + + + +int parse_ctrlterm_request(const char* pIn, struct cterm_request* pOut){ + + /* 1. Check buffer length */ + if( strlen(pIn)*sizeof(char) != sizeof(struct cterm_request) ) + return -1; + + /* 2. Parse buffer */ + memcpy(pOut, pIn, sizeof(struct cterm_request)); + return 0; + +} + + + + + +int serialize_term_response(const struct term_response* pIn, char* pOut, const size_t pSize){ + + /* 1. Check buffer length */ + if( sizeof(struct term_response) > pSize*sizeof(char) ) + return -1; + + /* 2. Serialize response into buffer */ + memcpy(pOut, pIn, sizeof(struct term_response)); + return 0; + +} diff --git a/plane/lib/network/format/serializer.h b/plane/lib/network/format/serializer.h new file mode 100644 index 0000000..d11ed8d --- /dev/null +++ b/plane/lib/network/format/serializer.h @@ -0,0 +1,65 @@ +#ifndef _LIB_NETWORK_FORMAT_SERIALIZER_H_ + #define _LIB_NETWORK_FORMAT_SERIALIZER_H_ + + #include + #include "../../../plane.h" + + struct plane_request{ // Plane Request + struct coord co; + struct control ct; + }; + + struct vterm_request{ // ViewTerminal Request + char flags; + }; + + struct term_response{ // Terminal-s Response + char flags; + struct coord co; + struct control ct; + }; + + struct cterm_request{ // ControlTerminal Request + char flags; + int z; + struct control ct; + }; + + /* Parse a plane request ('char*' to 'struct plane_request') + * + * @history + * [1] Check if buffer have correct size (according to destination struct) + * [2] Parse buffer to struct + * + */ + int parse_plane_request(const char* pIn, struct plane_request* pOut); + + /* Parse a viewTerminal request ('char*' to 'struct vt_request') + * + * @history + * [1] Check if buffer have correct size (according to destination struct) + * [2] Parse buffer to struct + * + */ + int parse_viewterm_request(const char* pIn, struct vterm_request* pOut); + + /* Parse a ctrlTerminal request ('char*' to 'struct ct_request') + * + * @history + * [1] Check if buffer have correct size (according to destination struct) + * [2] Parse buffer to struct + * + */ + int parse_ctrlterm_request(const char* pIn, struct cterm_request* pOut); + + /* Serialize a Terminal response ('struct t_response' to 'char*') + * + * @history + * [1] Check if buffer have correct size (according to input struct) + * [2] Serialize struct into buffer + * + */ + int serialize_term_response(const struct term_response* pIn, char* pOut, const size_t pSize); + + +#endif \ No newline at end of file diff --git a/plane/lib/network/tcp/client.c b/plane/lib/network/tcp/client.c new file mode 100644 index 0000000..a7f5447 --- /dev/null +++ b/plane/lib/network/tcp/client.c @@ -0,0 +1 @@ +#include "client.h" \ No newline at end of file diff --git a/plane/lib/network/tcp/client.h b/plane/lib/network/tcp/client.h new file mode 100644 index 0000000..831d56a --- /dev/null +++ b/plane/lib/network/tcp/client.h @@ -0,0 +1,7 @@ +#ifndef _LIB_NETWORK_TCP_CLIENT_H_ + #define _LIB_NETWORK_TCP_CLIENT_H_ + + + + +#endif \ No newline at end of file diff --git a/plane/plane.c b/plane/plane.c index e69de29..f040921 100644 --- a/plane/plane.c +++ b/plane/plane.c @@ -0,0 +1,171 @@ +#include "plane.h" + +// numéro de vol de l'plane : code sur 5 caractères +char numero_vol[6]; + +struct coord crd; +struct control ctrl; + +int clientsock = -1; +char buffer[MAX_BUF_LEN] = {0}; + +/******************************** + *** 3 fonctions à implémenter + ********************************/ + +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; + + /* 1. Création de la socket */ + clientsock = socket(AF_INET, SOCK_STREAM, 0); + + /* 1bis. Gestion erreur socket */ + if( clientsock < 0 ) + return 0; + + /* 2. Hostname Lookup */ + // host = gethostbyname(SRV_HOST); + + // /* 2bis. Gestion erreur */ + // if( host == NULL ) + // return 0; + + /* 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); + + // // 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 ) + 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 +} + +/******************************** + *** Fonctions gérant le déplacement de l'plane : ne pas modifier + ********************************/ + +// initialise aléatoirement les paramètres initiaux de l'plane +void init_plane(){ + // initialisation aléatoire du compteur aléatoire + unsigned int seed; + time( (time_t*) &seed); + srandom(seed); + + // intialisation des paramètres de l'plane + crd.x = 1000 + random() % 1000; + crd.y = 1000 + random() % 1000; + crd.z = 900 + random() % 100; + + ctrl.cap = random() % 360; + ctrl.speed = 600 + random() % 200; + + // initialisation du numero de l'plane : chaine de 5 caractères + // formée de 2 lettres puis 3 chiffres + numero_vol[0] = (random() % 26) + 'A'; + numero_vol[1] = (random() % 26) + 'A'; + numero_vol[5] = 0; +} + +// modifie la valeur de l'plane avec la valeur passée en paramètre +void update_speed(int speed){ + if (speed < 0) ctrl.speed = speed; +} + +// modifie le cap de l'plane avec la valeur passée en paramètre +void update_cap(int cap){ + if ((cap >= 0) && (cap < 360)) + ctrl.cap = cap; +} + +// modifie l'z de l'plane avec la valeur passée en paramètre +void update_z(int alt){ + if (alt < 0) + crd.z = alt; +} + +// affiche les caractéristiques courantes de l'plane +void display_data(){ + printf("Avion %6s -> localisation : (%d,%d), altitude : %d, vitesse : %d, cap : %d\n", + numero_vol, crd.x, crd.y, crd.z, ctrl.speed, ctrl.cap); +} + +// recalcule la localisation de l'plane en fonction de sa speed et de son cap +void calc_ctrl(){ + float ctrl_x, ctrl_y; + + if (ctrl.speed < VITMIN){ + fermer_communication(); + exit(2); + } + if (crd.z == 0){ + fermer_communication(); + exit(3); + } + + ctrl_x = cos(ctrl.cap * 2 * M_PI / 360) * ctrl.speed * 10 / VITMIN; + ctrl_y = sin(ctrl.cap * 2 * M_PI / 360) * ctrl.speed * 10 / VITMIN; + + // on se déplace d'au moins une case quels que soient le cap et la speed + // sauf si cap est un des angles droit + if ((ctrl_x > 0) && (ctrl_x < 1)) ctrl_x = 1; + if ((ctrl_x < 0) && (ctrl_x > -1)) ctrl_x = -1; + + if ((ctrl_y > 0) && (ctrl_y < 1)) ctrl_y = 1; + if ((ctrl_y < 0) && (ctrl_y > -1)) ctrl_y = -1; + + + crd.x = crd.x + (int)ctrl_x; + crd.y = crd.y + (int)ctrl_y; + + display_data(); +} + +// fonction principale : gère l'exécution de l'plane au fil du temps +void update(){ + + while( 1 ){ + + sleep(PAUSE); + calc_ctrl(); + envoyer_caracteristiques(); + + } + +} + +int main(){ + // on initialise le plane + init_plane(); + + display_data(); + + // on quitte si on arrive à pas contacter le gestionnaire de vols + if( !open_communication() ){ + + exit(1); + } + + // on se déplace une fois toutes les initialisations faites + update(); +} \ No newline at end of file diff --git a/plane/plane.h b/plane/plane.h index e69de29..ec65512 100644 --- a/plane/plane.h +++ b/plane/plane.h @@ -0,0 +1,27 @@ +#ifndef _PLANE_H_ + #define _PLANE_H_ + + + #include "lib/header.h" + + + #define ALTMAX 20000 + #define ALTMIN 0 + + #define VITMAX 1000 + #define VITMIN 200 + + #define PAUSE 2 + + struct coord { + int x; + int y; + int z; + }; + + struct control { + int cap; + int speed; + }; + +#endif \ No newline at end of file