Lib tcp/udp in progress

This commit is contained in:
xdrm-brackets 2017-04-01 17:01:36 +02:00
parent b41a8d304f
commit 94c4769241
22 changed files with 869 additions and 588 deletions

1
central-manager/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.vscode

29
central-manager/Makefile Normal file
View File

@ -0,0 +1,29 @@
CFLAGS=-Wall -pthread
# Runs 'all' depenency as default / i.e. 'make' command will run 'make all' implicitly
default: all
lib/network/tcp/server.o: lib/header.h lib/network/tcp/server.h lib/network/tcp/server.c
gcc $(CFLAGS) -c -o lib/network/tcp/server.o lib/network/tcp/server.c
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
# 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
# Run full compilation
all: boot
# cleans the compiled files
clean:
rm boot;
rm ./**/*.o

View File

@ -1,85 +1,218 @@
#include "central-manager.h" #include "central-manager.h"
/* /*
* *
* @argv : {0:program name}
*
* @history * @history
* [0] Initialisation des variables * [0] Initialisation des variables
* [1] On démarre le SERVEUR d'écoute globale * [1] On démarre le SERVEUR TCP d'écoute globale
* [2] Attente d'une demande de connection, puis création d'un THREAD * [2] On démarre le SERVEUR UDP d'écoute globale
* [3] On attends la fin de tous les THREADS * repeat:
* [4] On ferme la SOCKET d'écoute globale * [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
*
*/ */
int main(int argc, char* argv[]){ int main(int argc, char* argv[]){
/* [1] Lancement des THREADS d'écoute
=========================================================*/
/* (1) Ecoute TCP */
pthread_create(&listenManagers[0], NULL, LISTEN_TCP, NULL);
if( DEBUGMOD&THR ) printf("LISTEN THREAD[TCP] démarré\n");
/* (2) Ecoute UDP */
pthread_create(&listenManagers[1], NULL, LISTEN_UDP, NULL);
if( DEBUGMOD&THR ) printf("LISTEN THREAD[UDP] démarré\n");
/* [2] On attends la fin de tous les THREADS
==========================================================*/
pthread_join(listenManagers[0], NULL);
pthread_join(listenManagers[1], NULL);
/* [4] On ferme la SOCKET d'écoute globale
==========================================================*/
printf("FERMETURE DE TOUTES LES CONNECTIONS!\n");
}
/* Attente de connection TCP
*
* @history
* [0] Initialisation des variables
* [1] On démarre le SERVEUR TCP d'écoute globale
* [2] Attente d'une demande de connection TCP -> création d'un THREAD
* [3] On attends la fin de tous les THREADS
* [4] On ferme la SOCKET d'écoute TCP globale
*
*/
void* LISTEN_TCP(){
/* [0] Initialisation des variables /* [0] Initialisation des variables
==========================================================*/ ==========================================================*/
int THREADABLE_SOCKET = -1; // contiendra le BUS DE COMMANDE utilisateur à envoyer à un THREAD int CLIENT_SOCKET; // contiendra la socket TCP à envoyer sur un THREAD
struct sockaddr_storage clientInfo; // contiendra les infos client struct sockaddr_in clientInfo; // contiendra les infos client
char repeat; // sert à sortir de la boucle socklen_t len; // taille de la socket
socklen_t len = sizeof(struct sockaddr_storage); int index, i; // compteurs
// retour de @DROP_SERVER // retour de @DROP_TCP_SERVER
char* serverPort; // contiendra le port int LISTENSOCK; // contiendra la socket d'écoute TCP
int LISTENSOCK; // contiendra la socket d'écoute
/* [1] On démarre le SERVEUR d'écoute globale /* [1] On démarre le SERVEUR TCP d'écoute globale
==========================================================*/ ==========================================================*/
serverPort = malloc(maxPortLen); if( DROP_TCP_SERVER(TCP_PORT, &LISTENSOCK) < 0 ){
// attribution du port si dans les arguments if( DEBUGMOD&SCK ) printf("\tErreur de mise en place de la socket d'écoute TCP\n");
if( argc > 1 ) strcpy(serverPort, argv[1]);
// On ferme la SOCKET d'écoute globale
DROP_SERVER(remoteHost, &serverPort, &LISTENSOCK); printf("\tFERMETURE DE L'ECOUTE TCP!\n");
printf("Port: %s\n", serverPort); close(LISTENSOCK);
return NULL;
}
printf("\tTCP Listen Port: %d\n", TCP_PORT);
/* [2] Attente d'une demande de connection, puis création d'un THREAD /* [2] Attente d'une demande de connection, pour création d'un THREAD
============================================================================*/ ============================================================================*/
int index = -1;
while( 1 ){ while( 1 ){
/* 1. On initialise la SOCKET en attendant la connexion et le rang du "manager" inactif */
THREADABLE_SOCKET = -1;
index = -1;
/* 2. On attends une connection */ /* 1. On initialise les SOCKET en attendant la connexion et le rang du "manager" inactif */
THREADABLE_SOCKET = accept(LISTENSOCK, (struct sockaddr *) &clientInfo, &len); CLIENT_SOCKET = -1;
index = -1;
/* 3. On cherche un "manager" libre */ /* 2. On attends une connection TCP */
int i; CLIENT_SOCKET = accept(LISTENSOCK, (struct sockaddr*) &clientInfo, &len);
// si on trouve un "manager" inactif, on l'enregistre dans index /* 3. Si erreur, on attend une nouvelle connection */
for( i = 0 ; i < maxListLen ; i++ ) if( CLIENT_SOCKET < 0 ){
if( activeManagers[i] == 0 ){ index = i; break; } if( DEBUGMOD&SCK ) printf("\tErreur connection TCP\n");
break;
}
/* 4. On cherche un "manager" libre (inactif) */
for( i = 0 ; i < MAX_TCP_THR ; i++ )
if( activeTCPManagers[i] == 0 ){ index = i; break; }
// si on a trouvé un "manager" libre // si on a trouvé un "manager" libre
if( index != -1 ){ if( index != -1 ){
/* 4. On lance un thread pour le traitement de ce client */ /* 5. On lance un thread pour le traitement de ce client */
pthread_create(&managers[index], NULL, manageConnection, (void*)(intptr_t) THREADABLE_SOCKET); pthread_create(&TCPManagers[index], NULL, managePlane, (void*)(intptr_t) CLIENT_SOCKET);
if( DEBUGMOD&THR ) printf("THREAD[%d] démarré\n", index);
if( DEBUGMOD&THR ) printf("\tTHREAD[TCP][%d] démarré\n", index);
/* 6. On signale que ce "manager" est maintenant actif */
activeTCPManagers[index] = 1;
/* 5. On signale que ce "manager" est maintenant actif */
activeManagers[index] = 1;
}else }else
if( DEBUGMOD&THR ) printf("Demande de thread refusée!\n"); if( DEBUGMOD&THR ) printf("\tAucun thread TCP libre!\n");
} }
/* [3] On attends la fin de tous les THREADS /* [3] On attends la fin de tous les THREADS
==========================================================*/ ==========================================================*/
int i; for( i = 0 ; i < MAX_TCP_THR ; i++ )
for( i = 0 ; i < maxListLen ; i++ ) pthread_join(TCPManagers[i], NULL);
pthread_join(managers[i], NULL);
/* [4] On ferme la SOCKET d'écoute globale /* [4] On ferme la SOCKET d'écoute globale
==========================================================*/ ==========================================================*/
printf("FERMETURE DE TOUTES LES CONNECTIONS!\n"); printf("FERMETURE DE L'ECOUTE TCP!\n");
close(LISTENSOCK); close(LISTENSOCK);
return NULL;
}
/* Attente de connection UDP
*
* @history
* [0] Initialisation des variables
* [1] On démarre le SERVEUR UDP d'écoute globale
* [2] On attends un client
* [3] On gère la requête
* [4] On envoie la réponse
* [n] On ferme la SOCKET d'écoute UDP globale
*
*/
void* LISTEN_UDP(){
/* [0] Initialisation des variables
==========================================================*/
struct sockaddr_in clientInfo; // contiendra les infos client
char client_ip[20]; // IP du client
socklen_t len; // taille de la socket
int read; // compteurs
char request[MAX_BUF_LEN] = {0}; // buffer requête
// char response[MAX_BUF_LEN] = {0}; // buffer réponse
// retour de @DROP_UDP_SERVER
int SOCKET;
/* [1] On démarre le SERVEUR UDP d'écoute globale
==========================================================*/
if( DROP_UDP_SERVER(UDP_PORT, &SOCKET) < 0 ){
if( DEBUGMOD&SCK ) printf("\tErreur de mise en place de la socket UDP\n");
// On ferme la SOCKET d'écoute globale
printf("\tFERMETURE DE LA SOCKET UDP!\n");
close(SOCKET);
return NULL;
}
printf("\tUDP Listen Port: %d\n", UDP_PORT);
/* [2] Attente de connection
============================================================================*/
while( 1 ){
/* 0. On vide les données */
bzero(request, MAX_BUF_LEN);
bzero(&clientInfo, sizeof(struct sockaddr_in));
/* 1. On attends une connection UDP */
read = recvfrom(SOCKET, request, MAX_BUF_LEN, 0, (struct sockaddr*) &clientInfo, &len);
/* 2. Si erreur reception */
if( read < 0 ){
if( DEBUGMOD&BUF ) printf("\t\t[UDP] READ = %d\n", read);
break;
}
/* 3. On récupère l'adresse IP du client */
inet_ntop(AF_INET, &(clientInfo.sin_addr), client_ip, 20);
if( DEBUGMOD&SCK ) printf("\t[UDP] %s connecté\n", client_ip);
/* 3. Gestion requête */
printf("\t\tRequest(%d bytes) : '%s'\n", read, request);
}
/* [n] On ferme la SOCKET d'écoute globale
==========================================================*/
printf("\tFERMETURE DE LA SOCKET UDP!\n");
close(SOCKET);
return NULL;
} }
@ -89,108 +222,62 @@ int main(int argc, char* argv[]){
/* Gestion d'une connexion PLANE
/* Gestion d'une connexion client
* *
* @THREADABLE_SOCKET<void*> SOCKET de la connexion client * @THREADABLE_SOCKET<void*> SOCKET de la connexion client
* *
* @history * @history
* [1] Initialisation des variables * [1] Initialisation des variables
* [2] Envoi de la séquence de bienvenue * [2] Récupération de la requête
* [3] Attente des données reçues et reception (CLIENT_FTP->PROXY) * [3] Traitement de la requête
* [4] Traitement de la requête client * [4] Création de la réponse
* [5] Redirection de la requête vers le serveur FTP (PROXY->SERVER_FTP) * [5] Envoi de la réponse
* [6] Traitement de la reponse du serveur FTP * [6] On vide les buffers
* [7] Redirection de la réponse vers le client (PROXY->CLIENT_FTP) * [7] Fermeture de la connection (SOCKET)
* [8] On vide les buffers * [n] Arrêt du THREAD
* [9] Fermeture des connections (SOCKETS)
* [10] Arrêt du THREAD
* 1. On récupère le rang dans les "managers" * 1. On récupère le rang dans les "managers"
* 2. On met à jour "activeManagers" * 2. On met à jour "activeManagers"
* 3. On arrête le THREAD * 3. On arrête le THREAD
* *
*/ */
void* manageConnection(void* THREADABLE_SOCKET){ void* managePlane(void* THREADABLE_SOCKET){
int USER_SOCKET = (intptr_t) THREADABLE_SOCKET; // BUS DE COMMANDE utilisateur
/* [1] Variables /* [1] Initialisation des variables
============================================================================*/ =========================================================*/
// int USER_SOCKET = -1; int read; // compteur
int FTP_SOCKET = -1; // contiendra le BUS DE COMMANDE FTP int TCP_SOCKET = (intptr_t) THREADABLE_SOCKET; // Socket client
int DUSER_SOCKET = -1; // contiendra le BUS DE DONNES utilisateur char request[MAX_BUF_LEN]; // Requête
int DFTP_SOCKET = -1; // contiendra le BUS DE DONNEES FTP // char response[MAX_BUF_LEN]; // Réponse
char* BUFFER; // contiendra le BUFFER do{
char* ftp_response; // contiendra le BUFFER de réponse du serveur FTP (commandes)
int nbReceived, nbSend; // contiendra les nb reçu && envoyé
BUFFER = malloc( maxBuffLen );
int error;
/* [2] Envoi de la séquence de bienvenue /* [2] Récupération de la requête
============================================================================*/ =========================================================*/
swrite(&USER_SOCKET, WLCM_MSG); /* 1. On lit sur la socket */
read = recv(TCP_SOCKET, request, MAX_BUF_LEN, 0);
/* BOUCLE DE COMMANDES */ /* 2. Si erreur reception */
while( USER_SOCKET != -1 ){ if( read < 0 ){
if( DEBUGMOD&BUF ) printf("\t\t[TCP] READ = %d\n", read);
break;
}
/* [3] On récupère les données reçues (+attente) printf("\t\tRequest(%d bytes) : '%s'\n", read, request);
============================================================================*/
if( WAIT_SOCKET_UPDATE(&USER_SOCKET, BUFFER) == -1 ) break;
if( DEBUGMOD&CMD ) xPrint("C->P: %s\n", BUFFER);
}while( 0 );
/* [4] Traitement de la requête /* [n] Arrêt du THREAD
============================================================================*/
error = MANAGE_REQUEST(BUFFER, &USER_SOCKET, &FTP_SOCKET, &DUSER_SOCKET, &DFTP_SOCKET);
// si on a pas la connection FTP (commande) initialisée, on quitte
if( error == -1 ) break;
/* [5] Redirection vers le serveur FTP
============================================================================*/
if( DEBUGMOD&CMD ) xPrint("P->F: %s\n\n", BUFFER);
CLIENT_SEND(&FTP_SOCKET, BUFFER, &BUFFER);
if( DEBUGMOD&CMD ) xPrint("F->P: %s\n", BUFFER);
/* [6] Traitement de la réponse (FTP)
============================================================================*/
MANAGE_RESPONSE(BUFFER, &USER_SOCKET, &FTP_SOCKET, &DUSER_SOCKET, &DFTP_SOCKET);
/* [7] Redirection vers le CLIENT
============================================================================*/
if( swrite(&USER_SOCKET, BUFFER) == -1 ) break;
if( DEBUGMOD&CMD ) xPrint("P->C: %s\n", BUFFER);
/* [8] On vide les buffers
============================================================================*/
memset(BUFFER, '\0', maxBuffLen); // on vide le buffer
memset(BUFFER, '\0', maxBuffLen);
}
/* [9] Fermeture des connections (SOCKETS)
============================================================================*/
printf("CLOSING CONNECTIONS\n");
close(USER_SOCKET);
close(FTP_SOCKET);
/* [10] Arrêt du THREAD
============================================================================*/ ============================================================================*/
/* 1. On récupère le rang dans les "managers" */ /* 1. On récupère le rang dans les "managers" */
int i, index = -1; int i, index = -1;
for( i = 0 ; i < maxListLen ; i++ ) for( i = 0 ; i < MAX_TCP_THR ; i++ )
if( managers[i] == pthread_self() ){ index = i; break; } if( TCPManagers[i] == pthread_self() ){ index = i; break; }
/* 2. On met à jour "activeManagers" */ /* 2. On met à jour "activeManagers" */
if( index != -1 ) if( index != -1 )
activeManagers[index] = 0; activeTCPManagers[index] = 0;
/* 3. On arrête le THREAD */ /* 3. On arrête le THREAD */
if( DEBUGMOD&THR ) printf("THREAD[%d] libéré\n", index); if( DEBUGMOD&THR ) printf("\t\tTHREAD[TCP][%d] libéré\n", index);
pthread_exit(NULL); pthread_exit(NULL);
} }

View File

@ -1,57 +1,25 @@
/* global */ #include "lib/header.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <pthread.h>
/* sys */ #include "lib/plane/plane.h"
#include <sys/types.h>
#include <sys/socket.h>
/* socket */
#include <netinet/in.h>
#include <netdb.h> // getaddrinfo, getnameinfo
#include <arpa/inet.h>
/* debug */
#define SOCKETS 0x01 // debug RESEAU
#define COMMANDS 0x02 // debug COMMANDES
#define DATA 0x04 // debug DONNEES
#define REVEALS 0x08 // debug EXPLICITATION des strings
#define BUFFERS 0x10 // debug des BUFFERS
#define HEADERS 0x20 // debug des HEADERS de fonctions
#define THREADS 0x40 // debug des THREADS
#define SCK 0x01 // FILTRE pour SOCKET
#define CMD 0x02 // FILTRE pour COMMAND
#define DAT 0x04 // FILTRE pour DATA
#define RVL 0x08 // FILTRE pour REVEALS
#define BUF 0x10 // FILTRE pour BUFFERS
#define HDR 0x20 // FILTRE pour HEADERS
#define THR 0x40 // FILTRE pour THREADS
// possibilité de cumuler les DEBUGMODES
#define DEBUGMOD SOCKETS + THREADS // REVEALS + HEADER + THREADS
/* vars */
#define remoteHost "localhost"
#define remotePort "80"
#define maxBuffLen 4096
#define maxListLen 10
#define maxHostLen 64
#define maxPortLen 6
/* local dependencies */ /* local dependencies */
#include "dep/utility.c" #include "lib/util.h"
#include "dep/server.c" #include "lib/network/tcp/server.h"
#include "lib/network/udp/server.h"
/* headers */ /* headers */
void* manageConnection(void* THREADABLE_SOCKET); void* LISTEN_TCP();
void* LISTEN_UDP();
void* managePlane(void* THREADABLE_SOCKET);
// void* manageViewTerm(void* THREADABLE_SOCKET);
// void* manageCtrlTerm(void* THREADABLE_SOCKET);
// VARIABLES // VARIABLES THREADS D'ECOUTE TCP/UDP
static pthread_t managers[maxListLen]; // contiendra les THREADS static pthread_t listenManagers[2]; // contiendra les THREADS d'écoute
static int activeManagers[maxListLen] = {0}; // contiendra les THREADS actifs
// VARIABLES THREADS CONNECTION TCP
static pthread_t TCPManagers[MAX_TCP_THR]; // contiendra les THREADS TCP
static int activeTCPManagers[MAX_TCP_THR] = {0}; // contiendra les THREADS TCP actifs

View File

@ -1,60 +0,0 @@
/* Découpe la requête FTP en 2 parties
*
* @pRequest<char*> La requête en question
*
* @pCommand<char*> Remplissage: commande (1ère partie)
* @pContant<char*> Remplissage: contenu (2ème partie)
*
*
*/
void splitFtpRequest(char* pRequest, char* pCommand, char* pContent);
/* Découpe la réponse FTP en 2 parties
*
* @pAnswer<char*> La réponse en question
*
* @ftpCode<char*> Remplissage: code FTP (1ère partie)
* @ftpText<char*> 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<char*> La chaîne dans laquelle rechercher
* @needle<char> Le caractère recherché
*
* @return position<int> 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<char*> Schéma du print (1er arg)
* @pBuffer<char*> Buffer en question
*
*/
void xPrint(char* pPattern, char* pBuffer);
/* Révèle les caractères spéciaux d'une string
*
* @pString<char*> La string à révéler
*
*
* @print explicitString<char*> On affiche la chaîne explicité
*
*/
void revealString(char* pString);

View File

@ -0,0 +1,15 @@
/* debug */
#define SOCKETS 0x01 // debug RESEAU
#define REVEALS 0x02 // debug EXPLICITATION des strings
#define BUFFERS 0x04 // debug des BUFFERS
#define HEADERS 0x08 // debug des HEADERS de fonctions
#define THREADS 0x10 // debug des THREADS
#define SCK 0x01 // FILTRE pour SOCKET
#define RVL 0x02 // FILTRE pour REVEALS
#define BUF 0x04 // FILTRE pour BUFFERS
#define HDR 0x08 // FILTRE pour HEADERS
#define THR 0x10 // FILTRE pour THREADS
// possibilité de cumuler les DEBUGMODES
#define DEBUGMOD ( SOCKETS | THREADS ) // REVEALS + HEADER + THREADS

View File

@ -0,0 +1,37 @@
#ifndef _LIB_HEADER_H_
#define _LIB_HEADER_H_
/* global */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <stdint.h>
/* sys */
#include <sys/types.h>
#include <sys/socket.h>
/* socket */
#include <unistd.h> // close
#include <netinet/in.h>
#include <netdb.h> // getaddrinfo, getnameinfo
#include <arpa/inet.h>
#include "debug.h"
/* vars */
#define SRV_HOST "localhost"
#define TCP_PORT 4444
#define UDP_PORT 4444
#define MAX_BUF_LEN 512
#define MAX_TCP_THR 10
#define MAX_UDP_THR 10
#define maxHostLen 64
#define maxPortLen 6
#endif

View File

@ -0,0 +1,11 @@
#ifndef _LIB_NETWORK_FORMAT_SERIALIZER_H_
#define _LIB_NETWORK_FORMAT_SERIALIZER_H_
#include "../../header.h";
#endif

View File

@ -0,0 +1,67 @@
#include "server.h"
int DROP_TCP_SERVER(const int pPort, int* pListenSock){
if( DEBUGMOD&HDR ) printf("====== DROP_TCP_SERVER(%d, %p) ======\n\n", pPort, (void*) pListenSock);
/* [0] Initialisation des variables
=========================================================*/
// CREATION
static struct sockaddr_in addr; // contiendra les infos du serveur
int STATUS; // status
// INITIALISATION
*pListenSock = -1;
/* [1] Création de la socket
=======================================================*/
*pListenSock = socket(AF_INET, SOCK_STREAM, 0);
if( DEBUGMOD&SCK ) printf("\t\tTCP SOCKET = %d\n", *pListenSock);
// si erreur
if( *pListenSock < 0 ) return -1;
/* [2] On définit les infos de la socket
=========================================================*/
/* (1) Reset des valeurs */
bzero(&addr, sizeof(struct sockaddr_in));
/* (2) On définit les infos */
addr.sin_family = AF_INET;
addr.sin_port = htons(pPort);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
/* [3] On publie la SOCKET
=======================================================*/
STATUS = bind(*pListenSock, (struct sockaddr*) &addr, sizeof(addr));
if( DEBUGMOD&SCK ) printf("\t\tTCP BIND = %d\n", STATUS);
// si erreur
if( STATUS < 0 ) return -1;
/* [4] On met la socket sur écoute
=======================================================*/
STATUS = listen(*pListenSock, MAX_TCP_THR);
if( DEBUGMOD&SCK ) printf("\t\tTCP LISTEN = %d\n", STATUS);
// si erreur
if( STATUS < 0 ) return -1;
/* [n] Code succès
=========================================================*/
return 0;
}

View File

@ -0,0 +1,32 @@
#ifndef _LIB_NETWORK_TCP_SERVER_H_
#define _LIB_NETWORK_TCP_SERVER_H_
#include "../../header.h"
/* Créé et met un serveur TCP d'écoute
*
* ==IN==
* @pPort<const int> Port d'écoute TCP
*
* ==OUT==
* @pListenSocket<int*> Pointeur sur le <int> à remplir => contiendra un pointeur sur la socket d'écoute
*
* ==RETURN==
* @status<int> -1 si erreur, sinon 0
*
* @history
* [1] Création de la socket d'écoute
* [2] On définit les infos de la socket
* [3] On publie la SOCKET (bind)
* [4] On met la socket sur écoute (listen)
* [n] On renvoie la socket par référence
*
*/
int DROP_TCP_SERVER(const int pPort, int* pListenSock);
#endif

View File

@ -0,0 +1,58 @@
#include "server.h"
int DROP_UDP_SERVER(const int pPort, int* pListenSock){
if( DEBUGMOD&HDR ) printf("====== DROP_UDP_SERVER(%d, %p) ======\n\n", pPort, (void*) pListenSock);
/* [0] Initialisation des variables
=========================================================*/
// CREATION
static struct sockaddr_in addr; // contiendra les infos du serveur
int STATUS; // status
// INITIALISATION
*pListenSock = -1;
/* [1] Création de la socket
=======================================================*/
*pListenSock = socket(AF_INET, SOCK_DGRAM, 0);
if( DEBUGMOD&SCK ) printf("\t\tUDP SOCKET = %d\n", *pListenSock);
// si erreur
if( *pListenSock < 0 ) return -1;
/* [2] On définit les infos de la socket
=========================================================*/
/* (1) Reset des valeurs */
bzero(&addr, sizeof(struct sockaddr_in));
/* (2) On définit les infos */
addr.sin_family = AF_INET;
addr.sin_port = htons(pPort);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
/* [3] On publie la SOCKET
=======================================================*/
STATUS = bind(*pListenSock, (struct sockaddr*) &addr, sizeof(addr));
if( DEBUGMOD&SCK ) printf("\t\tUDP BIND = %d\n", STATUS);
// si erreur
if( STATUS < 0 ) return -1;
/* [n] Code succès
=========================================================*/
return 0;
}

View File

@ -0,0 +1,31 @@
#ifndef _LIB_NETWORK_UDP_SERVER_H_
#define _LIB_NETWORK_UDP_SERVER_H_
#include "../../header.h"
/* Créé et met un serveur UDP d'écoute
*
* ==IN==
* @pPort<const int> Port d'écoute UDP
*
* ==OUT==
* @pListenSocket<int*> Pointeur sur le <int> à remplir => contiendra un pointeur sur la socket d'écoute
*
* ==RETURN==
* @status<int> -1 si erreur, sinon 0
*
* @history
* [1] Création de la socket d'écoute
* [2] On définit les infos de la socket
* [3] On publie la SOCKET (bind)
* [n] On renvoie la socket par référence
*
*/
int DROP_UDP_SERVER(const int pPort, int* pListenSock);
#endif

View File

@ -0,0 +1 @@
../../../global/plane.c

View File

@ -0,0 +1 @@
../../../global/plane.h

View File

@ -5,137 +5,14 @@
void DROP_SERVER(const char* serverHost, char** givenPort, int* listenSocket){
if( DEBUGMOD&HDR ) printf("====== DROP_SERVER(%s, %s, %d) ======\n\n", serverHost, *givenPort, *listenSocket);
// FONCTIONNEMENT
struct addrinfo hints; // contiendra le filtre/format
struct addrinfo* addrinfo; // contiendra les infos du serveur
int SOCKET, BIND, LISTEN; // file_desc(s)
// INFOS
struct sockaddr_storage serverInfo; // contiendra les informations du server
socklen_t sockaddr_len = sizeof(struct sockaddr_storage);
char infoHost[maxHostLen]; // contiendra l'adresse du server
char infoPort[maxPortLen]; // contiendra le port du server
/* [1] On définit le filtre/format
=======================================================*/
memset(&hints, 0, sizeof(struct addrinfo)); // on vide le filtre
hints.ai_family = AF_UNSPEC; // Allow IPv4 ou IPv6
hints.ai_socktype = SOCK_STREAM; // TCP (SOCK_DGRAM = UDP)
hints.ai_flags = AI_PASSIVE; // mode SERVER
hints.ai_protocol = 0; // non spécifié
if( DEBUGMOD&SCK ) printf("============HINTS===========\n");
if( DEBUGMOD&SCK ) printf( "AI_FLAGS = %d\n", hints.ai_flags ); // int
if( DEBUGMOD&SCK ) printf( "AI_FAMILY = %d\n", hints.ai_family ); // int
if( DEBUGMOD&SCK ) printf( "AI_SOCKTYPE = %d\n", hints.ai_socktype ); // int
if( DEBUGMOD&SCK ) printf( "AI_PROTOCOL = %d\n", hints.ai_protocol ); // int
if( DEBUGMOD&SCK ) printf( "AI_ADDRLEN = %d\n", hints.ai_addrlen ); // int
if( DEBUGMOD&SCK ) printf("\n");
/* [2] On récupère les infos
=======================================================*/
if( strlen(*givenPort) == 0 ) // si pas défini, port dynamique
getaddrinfo(serverHost, 0, &hints, &addrinfo);
else // sinon manuel
getaddrinfo(serverHost, *givenPort, &hints, &addrinfo);
// Remarque: port=0 donc va être défini dynamiquement
if( DEBUGMOD&SCK ) printf("=============RES============\n");
if( DEBUGMOD&SCK ) printf( "AI_FLAGS = %d\n", addrinfo->ai_flags ); // int
if( DEBUGMOD&SCK ) printf( "AI_FAMILY = %d\n", addrinfo->ai_family ); // int
if( DEBUGMOD&SCK ) printf( "AI_SOCKTYPE = %d\n", addrinfo->ai_socktype ); // int
if( DEBUGMOD&SCK ) printf( "AI_PROTOCOL = %d\n", addrinfo->ai_protocol ); // int
if( DEBUGMOD&SCK ) printf( "AI_ADDRLEN = %d\n", addrinfo->ai_addrlen ); // int
if( DEBUGMOD&SCK ) printf("\n");
/* [3] Création de la socket
=======================================================*/
SOCKET = socket(addrinfo->ai_family, addrinfo->ai_socktype, 0);
if( DEBUGMOD&SCK ) printf("SOCKET = %d\n", SOCKET);
// si erreur
if( SOCKET == -1 ) return;
/* [4] On publie la SOCKET
=======================================================*/
BIND = bind(
SOCKET,
addrinfo->ai_addr,
addrinfo->ai_addrlen
);
if( DEBUGMOD&SCK ) printf("BIND = %d\n", BIND);
// si erreur
if( BIND == -1 ) return;
/* [5] On récupère les informations du serveur (host/port)
=======================================================*/
int getInfo = getsockname(SOCKET, (struct sockaddr *) &serverInfo, &sockaddr_len);
if( getInfo == -1 ) return;
getInfo = getnameinfo( // on récupère le host et le port
(struct sockaddr *) &serverInfo,
sizeof(serverInfo),
infoHost, maxHostLen,
infoPort, maxPortLen,
NI_NUMERICHOST | NI_NUMERICSERV
);
if( getInfo == -1 ) return;
if( DEBUGMOD&SCK ) printf("Server host: %s\n", infoHost);
if( DEBUGMOD&SCK ) printf("Server port: %s\n", infoPort);
// on a plus besoin des infos de l'adresse
freeaddrinfo(addrinfo);
/* [6] On met la socket sur écoute
=======================================================*/
LISTEN = listen(SOCKET, maxListLen);
if( DEBUGMOD&SCK ) printf("LISTEN = %d\n", LISTEN);
// si erreur
if( LISTEN == -1 ) return;
/* [7] On envoie les données par référence
=======================================================*/
// port
*givenPort = malloc( maxPortLen );
strcpy(*givenPort, infoPort);
// socket d'écoute
*listenSocket = SOCKET;
}
int MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET){ int MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET){
if( DEBUGMOD&HDR ) printf("====== MANAGE_REQUEST(%s, %d, %d, %d, %d) ======\n\n", pRequest, *USER_SOCKET, *FTP_SOCKET, *DUSER_SOCKET, *DFTP_SOCKET); if( DEBUGMOD&HDR ) printf("====== MANAGE_REQUEST(%s, %d, %d, %d, %d) ======\n\n", pRequest, *USER_SOCKET, *FTP_SOCKET, *DUSER_SOCKET, *DFTP_SOCKET);
char response[maxBuffLen]; // contiendra la réponse (2*taille buffer pour strcat(BUFLEN, BUFLEN)) char response[MAX_BUF_LEN]; // contiendra la réponse (2*taille buffer pour strcat(BUFLEN, BUFLEN))
int nbSend; // contiendra le nombre de données envoyées int nbSend; // contiendra le nombre de données envoyées
char rCommand[5]; // contiendra les commandes (1ère partie) char rCommand[5]; // contiendra les commandes (1ère partie)
char rContent[maxBuffLen]; // contiendra le contenu associé à la commande (2ème partie) char rContent[MAX_BUF_LEN]; // contiendra le contenu associé à la commande (2ème partie)
// on vide les buffers // on vide les buffers
memset(&rCommand, '\0', sizeof(rCommand)); memset(&rCommand, '\0', sizeof(rCommand));
@ -157,8 +34,8 @@ int MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER
char userName[100] = {0}; char userName[100] = {0};
char hostName[maxHostLen] = {0}; char hostName[maxHostLen] = {0};
// pour l'envoi de la séquence d'initialisation // pour l'envoi de la séquence d'initialisation
char* ftp_response; ftp_response = malloc(maxBuffLen); char* ftp_response; ftp_response = malloc(MAX_BUF_LEN);
memset(ftp_response, 0, maxBuffLen); memset(ftp_response, 0, MAX_BUF_LEN);
/* 1. On extrait @username et @hostname */ /* 1. On extrait @username et @hostname */
sscanf(rContent, "%[^@]@%s\r\n", userName, hostName); sscanf(rContent, "%[^@]@%s\r\n", userName, hostName);
@ -181,13 +58,13 @@ int MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER
/* 3. On envoie la séquence d'initialisation */ /* 3. On envoie la séquence d'initialisation */
CLIENT_SEND(FTP_SOCKET, "", &ftp_response); CLIENT_SEND(FTP_SOCKET, "", &ftp_response);
if( DEBUGMOD&CMD ) xPrint("P->F: %s\n\n", "\r\n"); if( DEBUGMOD&CMD ) xPrint("P->F: %s\n\n", "\r\n");
if( DEBUGMOD&CMD ) xPrint("F->P: %s\n", ftp_response); if( DEBUGMOD&CMD ) xPrint("F->P: %s\n", ftp_response);
/* 4. On envoie la requête USER au serveur FTP auquel on vient de se connecter */ /* 4. On envoie la requête USER au serveur FTP auquel on vient de se connecter */
char newRequest[maxBuffLen]; char newRequest[MAX_BUF_LEN];
strcat(newRequest, "USER "); strcat(newRequest, "USER ");
strcat(newRequest, userName); strcat(newRequest, userName);
strcat(newRequest, "\r\n"); strcat(newRequest, "\r\n");
@ -205,7 +82,7 @@ int MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER
char serverHost[maxHostLen] = {0}; char serverHost[maxHostLen] = {0};
char serverPort[maxPortLen] = {0}; char serverPort[maxPortLen] = {0};
char BUFFER[maxBuffLen] = {0}; char BUFFER[MAX_BUF_LEN] = {0};
/* 1. On récupère l'ip et le port de la réponse */ /* 1. On récupère l'ip et le port de la réponse */
sscanf(pRequest, "PORT %d,%d,%d,%d,%d,%d", &a1, &a2, &a3, &a4, &p1, &p2); sscanf(pRequest, "PORT %d,%d,%d,%d,%d,%d", &a1, &a2, &a3, &a4, &p1, &p2);
@ -219,7 +96,7 @@ int MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER
if( DEBUGMOD&SCK ) printf("CONNECTING TO CLIENT %s:%s\n", serverHost, serverPort); if( DEBUGMOD&SCK ) printf("CONNECTING TO CLIENT %s:%s\n", serverHost, serverPort);
CONNECT_CLIENT(serverHost, serverPort, DUSER_SOCKET); CONNECT_CLIENT(serverHost, serverPort, DUSER_SOCKET);
if( DEBUGMOD&SCK ) printf("CONNECTED TO CLIENT %s:%s\n", serverHost, serverPort); if( DEBUGMOD&SCK ) printf("CONNECTED TO CLIENT %s:%s\n", serverHost, serverPort);
/* 3. Envoi de "PASV" car on veut être en mode passif entre le proxy et le serveur FTP */ /* 3. Envoi de "PASV" car on veut être en mode passif entre le proxy et le serveur FTP */
strcpy(response, "PASV\r\n"); strcpy(response, "PASV\r\n");
} }
@ -243,9 +120,9 @@ int MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER
void MANAGE_RESPONSE(char* pAnswer, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET){ void MANAGE_RESPONSE(char* pAnswer, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET){
if( DEBUGMOD&HDR ) printf("====== MANAGE_RESPONSE(%s, %d, %d, %d, %d) ======\n\n", pAnswer, *USER_SOCKET, *FTP_SOCKET, *DUSER_SOCKET, *DFTP_SOCKET); if( DEBUGMOD&HDR ) printf("====== MANAGE_RESPONSE(%s, %d, %d, %d, %d) ======\n\n", pAnswer, *USER_SOCKET, *FTP_SOCKET, *DUSER_SOCKET, *DFTP_SOCKET);
char response[maxBuffLen]; // contiendra la réponse char response[MAX_BUF_LEN]; // contiendra la réponse
char ftpCodeStr[4]; // contiendra le code FTP (1ère partie) char ftpCodeStr[4]; // contiendra le code FTP (1ère partie)
char ftpText[maxBuffLen]; // contiendra le texte associé à la commande (2ème partie) char ftpText[MAX_BUF_LEN]; // contiendra le texte associé à la commande (2ème partie)
int ftpCode; // contiendra le code FTP en numérique int ftpCode; // contiendra le code FTP en numérique
// on vide les buffers // on vide les buffers
@ -259,13 +136,13 @@ void MANAGE_RESPONSE(char* pAnswer, int* USER_SOCKET, int* FTP_SOCKET, int* DUSE
splitFtpResponse(pAnswer, ftpCodeStr, ftpText); splitFtpResponse(pAnswer, ftpCodeStr, ftpText);
// on met le code FTP en <int> // on met le code FTP en <int>
ftpCode = atoi( ftpCodeStr ); ftpCode = atoi( ftpCodeStr );
// mise à disposition de variables temporaires // mise à disposition de variables temporaires
int tmp[6] = {0}; int tmp[6] = {0};
char serverHost[maxHostLen]; char serverHost[maxHostLen];
char serverPort[maxPortLen]; char serverPort[maxPortLen];
char BUFFER[maxBuffLen] = {0}; char BUFFER[MAX_BUF_LEN] = {0};
/* [2] Selection en fonction de @ftpCode /* [2] Selection en fonction de @ftpCode
================================================*/ ================================================*/
@ -367,14 +244,14 @@ void MANAGE_RESPONSE(char* pAnswer, int* USER_SOCKET, int* FTP_SOCKET, int* DUSE
// WAIT_SOCKET_UPDATE(FTP_SOCKET, BUFFER); // command // WAIT_SOCKET_UPDATE(FTP_SOCKET, BUFFER); // command
// WAIT_SOCKET_UPDATE(DFTP_SOCKET, BUFFER); // données // WAIT_SOCKET_UPDATE(DFTP_SOCKET, BUFFER); // données
// printf("") // printf("")
/* 5. On vide le BUS DE COMMANDE du serveur FTP */ /* 5. On vide le BUS DE COMMANDE du serveur FTP */
/* A. On définit un TIMEOUT (1 sec) */ /* A. On définit un TIMEOUT (1 sec) */
setSocketTimeout(FTP_SOCKET, 0, 50); setSocketTimeout(FTP_SOCKET, 0, 50);
/* B. On attends une réponse */ /* B. On attends une réponse */
tmp[2] = sread(FTP_SOCKET, BUFFER); tmp[2] = sread(FTP_SOCKET, BUFFER);
/* C. On enlève le TIMEOUT (default) */ /* C. On enlève le TIMEOUT (default) */
setSocketTimeout(FTP_SOCKET, SOCKET_TIMEOUT); setSocketTimeout(FTP_SOCKET, SOCKET_TIMEOUT);
@ -409,7 +286,7 @@ void MANAGE_RESPONSE(char* pAnswer, int* USER_SOCKET, int* FTP_SOCKET, int* DUSE
int WAIT_SOCKET_UPDATE(int* pSocket, char* pBuffer){ int WAIT_SOCKET_UPDATE(int* pSocket, char* pBuffer){
memset(pBuffer, 0, maxBuffLen); // on vide le buffer memset(pBuffer, 0, MAX_BUF_LEN); // on vide le buffer
int nbRead = 0; int nbRead = 0;

View File

@ -1,27 +1,4 @@
/* Créé et met un serveur sur écoute #include "server.h"
*
* ==IN==
* @serverHost<char*> Nom de l'hôte local (localhost)
* @givenPort<char**> Si renseigné, définit le port à utiliser
*
* ==OUT==
* @givenPort<char**> Pointeur sur le <char*> à remplir => contiendra le port donné par le système (si pas renseigné en entrée)
* @listenSocket<int*> Pointeur sur le <int> à remplir => contiendra un pointeur sur la socket d'écoute
*
*
*
* @history
* [1] On définit le filtre/format
* [2] On récupère les infos (adresse, port)
* Note: Gestion IPv4/IPv6
* [3] Création de la socket
* [4] On publie la SOCKET (bind)
* [5] On récupère les informations du serveur (host/port)
* [6] On met la socket sur écoute (listen)
* [7] On envoie les données par référence
*
*/
void DROP_SERVER(const char* serverHost, char** givenPort, int* listenSocket);
@ -30,11 +7,11 @@ void DROP_SERVER(const char* serverHost, char** givenPort, int* listenSocket);
* @pBuffer<char*> Requête en question * @pBuffer<char*> Requête en question
* @USER_SOCKET<int*> Pointeur sur la SOCKET du BUS DE COMMANDES utilisateur * @USER_SOCKET<int*> Pointeur sur la SOCKET du BUS DE COMMANDES utilisateur
* @FTP_SOCKET<int*> Pointeur sur la SOCKET du BUS DE COMMANDES FTP * @FTP_SOCKET<int*> Pointeur sur la SOCKET du BUS DE COMMANDES FTP
* @DUSER_SOCKET<int*> Pointeur sur la SOCKET du BUS DE DONNEES utilisateur * @DUSER_SOCKET<int*> Pointeur sur la SOCKET du BUS DE DONNEES utilisateur
* @DFTP_SOCKET<int*> Pointeur sur la SOCKET du BUS DE DONNEES FTP * @DFTP_SOCKET<int*> Pointeur sur la SOCKET du BUS DE DONNEES FTP
*
* *
* *
*
* @history * @history
* [1] On découpe la requête en 2 parties (rCommand, rContent) * [1] On découpe la requête en 2 parties (rCommand, rContent)
* [2] Selection en fonction de @rCommand * [2] Selection en fonction de @rCommand
@ -49,9 +26,9 @@ void DROP_SERVER(const char* serverHost, char** givenPort, int* listenSocket);
* 2. On se connecte au client * 2. On se connecte au client
* 3. Envoi de "PASV" car on veut être en mode passif entre le proxy et le serveur FTP * 3. Envoi de "PASV" car on veut être en mode passif entre le proxy et le serveur FTP
* (n) Si aucun traitement on recopie la requête telquel * (n) Si aucun traitement on recopie la requête telquel
* *
* [3] Retour de la réponse * [3] Retour de la réponse
* *
*/ */
int MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET); int MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET);
@ -64,11 +41,11 @@ int MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER
* @pAnswer<char**> Pointeur sur le buffer de réponse du serveur FTP * @pAnswer<char**> Pointeur sur le buffer de réponse du serveur FTP
* @USER_SOCKET<int*> Pointeur sur la SOCKET du BUS DE COMMANDES utilisateur * @USER_SOCKET<int*> Pointeur sur la SOCKET du BUS DE COMMANDES utilisateur
* @FTP_SOCKET<int*> Pointeur sur la SOCKET du BUS DE COMMANDES FTP * @FTP_SOCKET<int*> Pointeur sur la SOCKET du BUS DE COMMANDES FTP
* @DUSER_SOCKET<int*> Pointeur sur la SOCKET du BUS DE DONNEES utilisateur * @DUSER_SOCKET<int*> Pointeur sur la SOCKET du BUS DE DONNEES utilisateur
* @DFTP_SOCKET<int*> Pointeur sur la SOCKET du BUS DE DONNEES FTP * @DFTP_SOCKET<int*> Pointeur sur la SOCKET du BUS DE DONNEES FTP
*
* *
* *
*
* @history * @history
* [1] On découpe la requête en 2 parties (ftpCode, ftpText) * [1] On découpe la requête en 2 parties (ftpCode, ftpText)
* [2] Selection en fonction de @ftpCode * [2] Selection en fonction de @ftpCode
@ -82,7 +59,7 @@ int MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER
* 1. On récupère l'ip et le port de la réponse * 1. On récupère l'ip et le port de la réponse
* 2. Connexion au serveur FTP * 2. Connexion au serveur FTP
* 3. Envoi du message de code 200 * 3. Envoi du message de code 200
* *
* (8) 150- On lit la SOCKET FTP du BUS DE DONNEES * (8) 150- On lit la SOCKET FTP du BUS DE DONNEES
* 1. Envoi au client de l'écoute de la réponse (associée) du BUS DE DONNEES * 1. Envoi au client de l'écoute de la réponse (associée) du BUS DE DONNEES
* 2. On lit la SOCKET FTP (BUS DE DONNEES) * 2. On lit la SOCKET FTP (BUS DE DONNEES)
@ -93,7 +70,7 @@ int MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER
* B. On attends une réponse * B. On attends une réponse
* C. On enlève le TIMEOUT (default) * C. On enlève le TIMEOUT (default)
* 6. On transmet le message de fin de la transaction (226) * 6. On transmet le message de fin de la transaction (226)
* *
* (9) 226- Fin de transfert de données (fermeture SOCKETS du BUS DE DONNEES) * (9) 226- Fin de transfert de données (fermeture SOCKETS du BUS DE DONNEES)
* (n) xxx- Commande inconnue * (n) xxx- Commande inconnue
* *
@ -111,9 +88,9 @@ void MANAGE_RESPONSE(char* pAnswer, int* USER_SOCKET, int* FTP_SOCKET, int* DUSE
* @pBuffer<char*> Buffer qui contiendra la réponse * @pBuffer<char*> Buffer qui contiendra la réponse
* *
* @return nbRead<int> On retourne le nombre de char lus, sinon -1 si erreur * @return nbRead<int> On retourne le nombre de char lus, sinon -1 si erreur
*
* *
* *
*
* @history * @history
* [1] On read() tant qu'on a pas les symboles de fin "\r\n" * [1] On read() tant qu'on a pas les symboles de fin "\r\n"
* [2] On écrit sur le BUFFER * [2] On écrit sur le BUFFER

View File

@ -1,74 +1,9 @@
#include "utility.h" #include "util.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){ int swrite(int* pSocket, char* pBuffer){
if( *pSocket == -1 ) return -1; // si SOCKET fermée, on retourne une erreur 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 if( strlen(pBuffer) == 0 ) return 0; // si on a rien à écrire, on n'écrit rien :p
/* 1. On écrit sur la SOCKET */ /* 1. On écrit sur la SOCKET */
@ -97,11 +32,11 @@ int sread(int* pSocket, char* pBuffer){
/* 1. On vide le buffer avant de lire */ /* 1. On vide le buffer avant de lire */
memset(pBuffer, '\0', maxBuffLen); memset(pBuffer, '\0', MAX_BUF_LEN);
if( DEBUGMOD&BUF ) printf("READLEN_1: %lu\n", strlen(pBuffer)); if( DEBUGMOD&BUF ) printf("READLEN_1: %lu\n", strlen(pBuffer));
/* 2. On lit la SOCKET */ /* 2. On lit la SOCKET */
int nbRead = read(*pSocket, pBuffer, maxBuffLen); int nbRead = read(*pSocket, pBuffer, MAX_BUF_LEN);
if( DEBUGMOD&BUF ) printf("READLEN_3: %d\n", nbRead); if( DEBUGMOD&BUF ) printf("READLEN_3: %d\n", nbRead);
@ -127,13 +62,13 @@ void setSocketTimeout(int* pSocket, const int pSec, const int pUSec){
timeout.tv_usec = pUSec; timeout.tv_usec = pUSec;
setsockopt(*pSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(struct timeval)); 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 ); if( DEBUGMOD&SCK ) printf("Set socket(%d) timeout to %lus\n", *pSocket, (long unsigned) timeout.tv_sec );
} }
void xPrint(char* pPattern, char* pBuffer){ void xPrint(char* pPattern, char* pBuffer){
char tmpBuffer[maxBuffLen]; char tmpBuffer[MAX_BUF_LEN];
strcpy(tmpBuffer, pBuffer); strcpy(tmpBuffer, pBuffer);
@ -152,14 +87,14 @@ void xPrint(char* pPattern, char* pBuffer){
void revealString(char* pString){ void revealString(char* pString){
/* 1. On créé une copie de @pString */ /* 1. On créé une copie de @pString */
char revealedString[maxBuffLen] = {0}; char revealedString[MAX_BUF_LEN] = {0};
/* 2. On rend visible tous les caractères "invisibles" */ /* 2. On rend visible tous les caractères "invisibles" */
int i; int i;
for( i = 0 ; i < strlen(pString) && pString[i] != '\0' ; i++ ){ for( i = 0 ; i < strlen(pString) && pString[i] != '\0' ; i++ ){
if( pString[i] == '\r' ){ revealedString[strlen(revealedString)] = '\\'; revealedString[strlen(revealedString)] = 'r'; } if( pString[i] == '\r' ){ revealedString[strlen(revealedString)] = '\\'; revealedString[strlen(revealedString)] = 'r'; }
else if( pString[i] == '\n' ){ revealedString[strlen(revealedString)] = '\\'; revealedString[strlen(revealedString)] = 'n'; } else if( pString[i] == '\n' ){ revealedString[strlen(revealedString)] = '\\'; revealedString[strlen(revealedString)] = 'n'; }
else revealedString[strlen(revealedString)] = pString[i]; else revealedString[strlen(revealedString)] = pString[i];
revealedString[strlen(revealedString)] = '\0'; revealedString[strlen(revealedString)] = '\0';
} }

View File

@ -0,0 +1,29 @@
#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<char*> Schéma du print (1er arg)
* @pBuffer<char*> Buffer en question
*
*/
void xPrint(char* pPattern, char* pBuffer);
/* Révèle les caractères spéciaux d'une string
*
* @pString<char*> La string à révéler
*
*
* @print explicitString<char*> On affiche la chaîne explicité
*
*/
void revealString(char* pString);

167
global/plane.c Normal file
View File

@ -0,0 +1,167 @@
#include <math.h>
#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();
}

18
global/plane.h Normal file
View File

@ -0,0 +1,18 @@
#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;
};

View File

@ -3,23 +3,23 @@
<head data-suburl=""> <head data-suburl="">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge"/> <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="author" content="xdrm-brackets" /> <meta name="author" content="xdrm-brackets" />
<meta name="description" content="proxy.ftp.c" /> <meta name="description" content="proxy.ftp.c" />
<meta name="keywords" content="go, git, self-hosted, gogs"> <meta name="keywords" content="go, git, self-hosted, gogs">
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<meta name="_csrf" content="oL9HDhjy3U7tPSwjawLkQB4VNfA6MTQ5MDcxOTc2NTY0Nzg0MDkyNQ==" /> <meta name="_csrf" content="oL9HDhjy3U7tPSwjawLkQB4VNfA6MTQ5MDcxOTc2NTY0Nzg0MDkyNQ==" />
<meta name="_suburl" content="" /> <meta name="_suburl" content="" />
<meta property="og:url" content="https://git.xdrm.io/xdrm-brackets/proxy.ftp.c" /> <meta property="og:url" content="https://git.xdrm.io/xdrm-brackets/proxy.ftp.c" />
<meta property="og:type" content="object" /> <meta property="og:type" content="object" />
<meta property="og:title" content="xdrm-brackets/proxy.ftp.c"> <meta property="og:title" content="xdrm-brackets/proxy.ftp.c">
<meta property="og:description" content=""> <meta property="og:description" content="">
<link rel="shortcut icon" href="/img/favicon.png" /> <link rel="shortcut icon" href="/img/favicon.png" />
@ -28,16 +28,16 @@
<link rel="stylesheet" href="/assets/font-awesome-4.6.3/css/font-awesome.min.css"> <link rel="stylesheet" href="/assets/font-awesome-4.6.3/css/font-awesome.min.css">
<link rel="stylesheet" href="/assets/octicons-4.3.0/octicons.min.css"> <link rel="stylesheet" href="/assets/octicons-4.3.0/octicons.min.css">
<link rel="stylesheet" href="/css/semantic-2.2.7.min.css"> <link rel="stylesheet" href="/css/semantic-2.2.7.min.css">
<link rel="stylesheet" href="/css/gogs.css?v=73519fd9811805bce6fc4aa2d24bb413"> <link rel="stylesheet" href="/css/gogs.css?v=73519fd9811805bce6fc4aa2d24bb413">
<script src="/js/semantic-2.2.7.min.js"></script> <script src="/js/semantic-2.2.7.min.js"></script>
<script src="/js/gogs.js?v=73519fd9811805bce6fc4aa2d24bb413"></script> <script src="/js/gogs.js?v=73519fd9811805bce6fc4aa2d24bb413"></script>
@ -45,13 +45,13 @@
<meta name="theme-color" content="#ff5343"> <meta name="theme-color" content="#ff5343">
</head> </head>
<body> <body>
<div class="full height"> <div class="full height">
<noscript>Please enable JavaScript in your browser!</noscript> <noscript>Please enable JavaScript in your browser!</noscript>
<div class="following bar light"> <div class="following bar light">
<div class="ui container"> <div class="ui container">
<div class="ui grid"> <div class="ui grid">
@ -61,34 +61,34 @@
<img class="ui mini image" src="/img/favicon.png"> <img class="ui mini image" src="/img/favicon.png">
</a> </a>
<a class="item" href="/">Home</a> <a class="item" href="/">Home</a>
<a class="item" href="/explore/repos">Explore</a> <a class="item" href="/explore/repos">Explore</a>
<a class="item" target="_blank" href="https://gogs.io/docs" rel="noreferrer">Help</a> <a class="item" target="_blank" href="https://gogs.io/docs" rel="noreferrer">Help</a>
<div class="right menu"> <div class="right menu">
<a class="item" href="/user/sign_up"> <a class="item" href="/user/sign_up">
<i class="octicon octicon-person"></i> Register <i class="octicon octicon-person"></i> Register
</a> </a>
<a class="item" href="/user/login?redirect_to=%2fxdrm-brackets%2fproxy.ftp.c%2fsrc%2fmaster%2fdep%2fclient.c"> <a class="item" href="/user/login?redirect_to=%2fxdrm-brackets%2fproxy.ftp.c%2fsrc%2fmaster%2fdep%2fclient.c">
<i class="octicon octicon-sign-in"></i> Sign In <i class="octicon octicon-sign-in"></i> Sign In
</a> </a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="repository file list"> <div class="repository file list">
@ -103,8 +103,8 @@
<a href="/xdrm-brackets">xdrm-brackets</a> <a href="/xdrm-brackets">xdrm-brackets</a>
<div class="divider"> / </div> <div class="divider"> / </div>
<a href="/xdrm-brackets/proxy.ftp.c">proxy.ftp.c</a> <a href="/xdrm-brackets/proxy.ftp.c">proxy.ftp.c</a>
</div> </div>
<div class="ui right"> <div class="ui right">
@ -124,7 +124,7 @@
0 0
</a> </a>
</div> </div>
<div class="ui labeled button" tabindex="0"> <div class="ui labeled button" tabindex="0">
<a class="ui button " href="/repo/fork/49"> <a class="ui button " href="/repo/fork/49">
<i class="octicon octicon-repo-forked"></i>Fork <i class="octicon octicon-repo-forked"></i>Fork
@ -133,7 +133,7 @@
0 0
</a> </a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
@ -146,28 +146,28 @@
<a class="active item" href="/xdrm-brackets/proxy.ftp.c"> <a class="active item" href="/xdrm-brackets/proxy.ftp.c">
<i class="octicon octicon-file-text"></i> Files <i class="octicon octicon-file-text"></i> Files
</a> </a>
<a class=" item" href="/xdrm-brackets/proxy.ftp.c/issues"> <a class=" item" href="/xdrm-brackets/proxy.ftp.c/issues">
<i class="octicon octicon-issue-opened"></i> Issues <span class="ui gray small label">0</span> <i class="octicon octicon-issue-opened"></i> Issues <span class="ui gray small label">0</span>
</a> </a>
<a class=" item" href="/xdrm-brackets/proxy.ftp.c/pulls"> <a class=" item" href="/xdrm-brackets/proxy.ftp.c/pulls">
<i class="octicon octicon-git-pull-request"></i> Pull Requests <span class="ui gray small label">0</span> <i class="octicon octicon-git-pull-request"></i> Pull Requests <span class="ui gray small label">0</span>
</a> </a>
<a class=" item" href="/xdrm-brackets/proxy.ftp.c/commits/master"> <a class=" item" href="/xdrm-brackets/proxy.ftp.c/commits/master">
<i class="octicon octicon-history"></i> Commits <span class="ui blue small label">23</span> <i class="octicon octicon-history"></i> Commits <span class="ui blue small label">23</span>
</a> </a>
<a class=" item" href="/xdrm-brackets/proxy.ftp.c/releases"> <a class=" item" href="/xdrm-brackets/proxy.ftp.c/releases">
<i class="octicon octicon-tag"></i> Releases <span class="ui gray small label">0</span> <i class="octicon octicon-tag"></i> Releases <span class="ui gray small label">0</span>
</a> </a>
<a class=" item" href="/xdrm-brackets/proxy.ftp.c/wiki"> <a class=" item" href="/xdrm-brackets/proxy.ftp.c/wiki">
<i class="octicon octicon-book"></i> Wiki <i class="octicon octicon-book"></i> Wiki
</a> </a>
</div> </div>
</div> </div>
<div class="ui tabs divider"></div> <div class="ui tabs divider"></div>
@ -175,7 +175,7 @@
</div> </div>
<div class="ui container"> <div class="ui container">
@ -184,7 +184,7 @@
<a class="link" href=""></a> <a class="link" href=""></a>
</p> </p>
<div class="ui secondary menu"> <div class="ui secondary menu">
<div class="fitted item choose reference"> <div class="fitted item choose reference">
<div class="ui floating filter dropdown" data-no-results="No results found."> <div class="ui floating filter dropdown" data-no-results="No results found.">
<div class="ui basic small button"> <div class="ui basic small button">
@ -217,12 +217,12 @@
</div> </div>
</div> </div>
<div id="branch-list" class="scrolling menu" > <div id="branch-list" class="scrolling menu" >
<div class="item selected" data-url="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c">master</div> <div class="item selected" data-url="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c">master</div>
</div> </div>
<div id="tag-list" class="scrolling menu" style="display: none"> <div id="tag-list" class="scrolling menu" style="display: none">
</div> </div>
</div> </div>
</div> </div>
@ -231,68 +231,68 @@
<div class="fitted item"> <div class="fitted item">
<div class="ui breadcrumb"> <div class="ui breadcrumb">
<a class="section" href="/xdrm-brackets/proxy.ftp.c/src/master">proxy.ftp.c</a> <a class="section" href="/xdrm-brackets/proxy.ftp.c/src/master">proxy.ftp.c</a>
<div class="divider"> / </div> <div class="divider"> / </div>
<span class="section"><a href="/xdrm-brackets/proxy.ftp.c/src/master/dep">dep</a></span> <span class="section"><a href="/xdrm-brackets/proxy.ftp.c/src/master/dep">dep</a></span>
<div class="divider"> / </div> <div class="divider"> / </div>
<span class="active section">client.c</span> <span class="active section">client.c</span>
</div> </div>
</div> </div>
<div class="right fitted item"> <div class="right fitted item">
<div id="file-buttons" class="ui tiny blue buttons">
</div>
<div id="file-buttons" class="ui tiny blue buttons">
</div>
</div> </div>
</div> </div>
<div id="file-content" class="tab-size-8"> <div id="file-content" class="tab-size-8">
<h4 class="ui top attached header" id="repo-read-file"> <h4 class="ui top attached header" id="repo-read-file">
<i class="file text outline icon ui left"></i> <i class="file text outline icon ui left"></i>
<strong>client.c</strong> <span class="text grey normal">3.9KB</span> <strong>client.c</strong> <span class="text grey normal">3.9KB</span>
<div class="ui right file-actions"> <div class="ui right file-actions">
<div class="ui buttons"> <div class="ui buttons">
<a class="ui button" href="/xdrm-brackets/proxy.ftp.c/src/18a5e4338baaec92912eee057d26004b57b0b2a0/dep/client.c">Permalink</a> <a class="ui button" href="/xdrm-brackets/proxy.ftp.c/src/18a5e4338baaec92912eee057d26004b57b0b2a0/dep/client.c">Permalink</a>
<a class="ui button" href="/xdrm-brackets/proxy.ftp.c/commits/master/dep/client.c">History</a> <a class="ui button" href="/xdrm-brackets/proxy.ftp.c/commits/master/dep/client.c">History</a>
<a class="ui button" href="/xdrm-brackets/proxy.ftp.c/raw/master/dep/client.c">Raw</a> <a class="ui button" href="/xdrm-brackets/proxy.ftp.c/raw/master/dep/client.c">Raw</a>
</div> </div>
<i class="octicon octicon-pencil btn-octicon poping up disabled" data-content="You must fork this repository before editing the file" data-position="bottom center" data-variation="tiny inverted"></i> <i class="octicon octicon-pencil btn-octicon poping up disabled" data-content="You must fork this repository before editing the file" data-position="bottom center" data-variation="tiny inverted"></i>
<i class="octicon octicon-trashcan btn-octicon poping up disabled" data-content="You must have write access to make or propose changes to this file" data-position="bottom center" data-variation="tiny inverted"></i> <i class="octicon octicon-trashcan btn-octicon poping up disabled" data-content="You must have write access to make or propose changes to this file" data-position="bottom center" data-variation="tiny inverted"></i>
</div> </div>
</h4> </h4>
<div class="ui attached table segment"> <div class="ui attached table segment">
<div id="" class="file-view code-view has-emoji"> <div id="" class="file-view code-view has-emoji">
<table> <table>
<tbody> <tbody>
<tr> <tr>
<td class="lines-num"><span id="L1">1</span><span id="L2">2</span><span id="L3">3</span><span id="L4">4</span><span id="L5">5</span><span id="L6">6</span><span id="L7">7</span><span id="L8">8</span><span id="L9">9</span><span id="L10">10</span><span id="L11">11</span><span id="L12">12</span><span id="L13">13</span><span id="L14">14</span><span id="L15">15</span><span id="L16">16</span><span id="L17">17</span><span id="L18">18</span><span id="L19">19</span><span id="L20">20</span><span id="L21">21</span><span id="L22">22</span><span id="L23">23</span><span id="L24">24</span><span id="L25">25</span><span id="L26">26</span><span id="L27">27</span><span id="L28">28</span><span id="L29">29</span><span id="L30">30</span><span id="L31">31</span><span id="L32">32</span><span id="L33">33</span><span id="L34">34</span><span id="L35">35</span><span id="L36">36</span><span id="L37">37</span><span id="L38">38</span><span id="L39">39</span><span id="L40">40</span><span id="L41">41</span><span id="L42">42</span><span id="L43">43</span><span id="L44">44</span><span id="L45">45</span><span id="L46">46</span><span id="L47">47</span><span id="L48">48</span><span id="L49">49</span><span id="L50">50</span><span id="L51">51</span><span id="L52">52</span><span id="L53">53</span><span id="L54">54</span><span id="L55">55</span><span id="L56">56</span><span id="L57">57</span><span id="L58">58</span><span id="L59">59</span><span id="L60">60</span><span id="L61">61</span><span id="L62">62</span><span id="L63">63</span><span id="L64">64</span><span id="L65">65</span><span id="L66">66</span><span id="L67">67</span><span id="L68">68</span><span id="L69">69</span><span id="L70">70</span><span id="L71">71</span><span id="L72">72</span><span id="L73">73</span><span id="L74">74</span><span id="L75">75</span><span id="L76">76</span><span id="L77">77</span><span id="L78">78</span><span id="L79">79</span><span id="L80">80</span><span id="L81">81</span><span id="L82">82</span><span id="L83">83</span><span id="L84">84</span><span id="L85">85</span><span id="L86">86</span><span id="L87">87</span><span id="L88">88</span><span id="L89">89</span><span id="L90">90</span><span id="L91">91</span><span id="L92">92</span><span id="L93">93</span><span id="L94">94</span><span id="L95">95</span><span id="L96">96</span><span id="L97">97</span><span id="L98">98</span><span id="L99">99</span><span id="L100">100</span><span id="L101">101</span><span id="L102">102</span><span id="L103">103</span><span id="L104">104</span><span id="L105">105</span><span id="L106">106</span><span id="L107">107</span></td> <td class="lines-num"><span id="L1">1</span><span id="L2">2</span><span id="L3">3</span><span id="L4">4</span><span id="L5">5</span><span id="L6">6</span><span id="L7">7</span><span id="L8">8</span><span id="L9">9</span><span id="L10">10</span><span id="L11">11</span><span id="L12">12</span><span id="L13">13</span><span id="L14">14</span><span id="L15">15</span><span id="L16">16</span><span id="L17">17</span><span id="L18">18</span><span id="L19">19</span><span id="L20">20</span><span id="L21">21</span><span id="L22">22</span><span id="L23">23</span><span id="L24">24</span><span id="L25">25</span><span id="L26">26</span><span id="L27">27</span><span id="L28">28</span><span id="L29">29</span><span id="L30">30</span><span id="L31">31</span><span id="L32">32</span><span id="L33">33</span><span id="L34">34</span><span id="L35">35</span><span id="L36">36</span><span id="L37">37</span><span id="L38">38</span><span id="L39">39</span><span id="L40">40</span><span id="L41">41</span><span id="L42">42</span><span id="L43">43</span><span id="L44">44</span><span id="L45">45</span><span id="L46">46</span><span id="L47">47</span><span id="L48">48</span><span id="L49">49</span><span id="L50">50</span><span id="L51">51</span><span id="L52">52</span><span id="L53">53</span><span id="L54">54</span><span id="L55">55</span><span id="L56">56</span><span id="L57">57</span><span id="L58">58</span><span id="L59">59</span><span id="L60">60</span><span id="L61">61</span><span id="L62">62</span><span id="L63">63</span><span id="L64">64</span><span id="L65">65</span><span id="L66">66</span><span id="L67">67</span><span id="L68">68</span><span id="L69">69</span><span id="L70">70</span><span id="L71">71</span><span id="L72">72</span><span id="L73">73</span><span id="L74">74</span><span id="L75">75</span><span id="L76">76</span><span id="L77">77</span><span id="L78">78</span><span id="L79">79</span><span id="L80">80</span><span id="L81">81</span><span id="L82">82</span><span id="L83">83</span><span id="L84">84</span><span id="L85">85</span><span id="L86">86</span><span id="L87">87</span><span id="L88">88</span><span id="L89">89</span><span id="L90">90</span><span id="L91">91</span><span id="L92">92</span><span id="L93">93</span><span id="L94">94</span><span id="L95">95</span><span id="L96">96</span><span id="L97">97</span><span id="L98">98</span><span id="L99">99</span><span id="L100">100</span><span id="L101">101</span><span id="L102">102</span><span id="L103">103</span><span id="L104">104</span><span id="L105">105</span><span id="L106">106</span><span id="L107">107</span></td>
<td class="lines-code"><pre><code class="c"><ol class="linenums"><li class="L1" rel="L1">#include &#34;client.h&#34;</li> <td class="lines-code"><pre><code class="c"><ol class="linenums"><li class="L1" rel="L1">#include &#34;client.h&#34;</li>
<li class="L2" rel="L2"></li> <li class="L2" rel="L2"></li>
@ -304,7 +304,7 @@
<li class="L8" rel="L8"> struct addrinfo* addrinfo; // contiendra les infos</li> <li class="L8" rel="L8"> struct addrinfo* addrinfo; // contiendra les infos</li>
<li class="L9" rel="L9"> int CONNECT; // file_desc(s)</li> <li class="L9" rel="L9"> int CONNECT; // file_desc(s)</li>
<li class="L10" rel="L10"> int GETADDRINFO; // contiendra l&#39;erreur ou pas de getaddrinfo()</li> <li class="L10" rel="L10"> int GETADDRINFO; // contiendra l&#39;erreur ou pas de getaddrinfo()</li>
<li class="L11" rel="L11"> char BUFFER[maxBuffLen]; // BUFFER de communication</li> <li class="L11" rel="L11"> char BUFFER[MAX_BUF_LEN]; // BUFFER de communication</li>
<li class="L12" rel="L12"></li> <li class="L12" rel="L12"></li>
<li class="L13" rel="L13"> /* [1] On définit le filtre/format</li> <li class="L13" rel="L13"> /* [1] On définit le filtre/format</li>
<li class="L14" rel="L14"> =======================================================*/</li> <li class="L14" rel="L14"> =======================================================*/</li>
@ -377,7 +377,7 @@
<li class="L81" rel="L81"></li> <li class="L81" rel="L81"></li>
<li class="L82" rel="L82">int CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer){</li> <li class="L82" rel="L82">int CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer){</li>
<li class="L83" rel="L83"> if( DEBUGMOD&amp;HDR ) printf(&#34;====== CLIENT_SEND(%d, %s, %s) ======\n\n&#34;, *pSocket, pRequest, *pAnswer);</li> <li class="L83" rel="L83"> if( DEBUGMOD&amp;HDR ) printf(&#34;====== CLIENT_SEND(%d, %s, %s) ======\n\n&#34;, *pSocket, pRequest, *pAnswer);</li>
<li class="L84" rel="L84"> char BUFFER[maxBuffLen] = {0};</li> <li class="L84" rel="L84"> char BUFFER[MAX_BUF_LEN] = {0};</li>
<li class="L85" rel="L85"></li> <li class="L85" rel="L85"></li>
<li class="L86" rel="L86"> /* [1] On écrit sur la socket</li> <li class="L86" rel="L86"> /* [1] On écrit sur la socket</li>
<li class="L87" rel="L87"> =======================================================*/</li> <li class="L87" rel="L87"> =======================================================*/</li>
@ -395,18 +395,18 @@
<li class="L99" rel="L99"></li> <li class="L99" rel="L99"></li>
<li class="L100" rel="L100"> /* [3] On retourne la réponse par référence</li> <li class="L100" rel="L100"> /* [3] On retourne la réponse par référence</li>
<li class="L101" rel="L101"> =======================================================*/</li> <li class="L101" rel="L101"> =======================================================*/</li>
<li class="L102" rel="L102"> *pAnswer = malloc( maxBuffLen );</li> <li class="L102" rel="L102"> *pAnswer = malloc( MAX_BUF_LEN );</li>
<li class="L103" rel="L103"> strcpy(*pAnswer, BUFFER);</li> <li class="L103" rel="L103"> strcpy(*pAnswer, BUFFER);</li>
<li class="L104" rel="L104"></li> <li class="L104" rel="L104"></li>
<li class="L105" rel="L105"> if( DEBUGMOD&amp;BUF ) printf(&#34;nbReceived: %d\n&#34;, nbRecup);</li> <li class="L105" rel="L105"> if( DEBUGMOD&amp;BUF ) printf(&#34;nbReceived: %d\n&#34;, nbRecup);</li>
<li class="L106" rel="L106"> if( DEBUGMOD&amp;BUF ) printf(&#34;Message: %s\n&#34;, *pAnswer);</li> <li class="L106" rel="L106"> if( DEBUGMOD&amp;BUF ) printf(&#34;Message: %s\n&#34;, *pAnswer);</li>
<li class="L107" rel="L107">}</li> <li class="L107" rel="L107">}</li>
</ol></code></pre></td> </ol></code></pre></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div> </div>
</div> </div>
</div> </div>
@ -421,7 +421,7 @@ function submitDeleteForm() {
} }
</script> </script>
</div> </div>
</div> </div>
@ -432,48 +432,48 @@ function submitDeleteForm() {
© 2017 Gogs Version: 0.10.10.0308 Page: <strong>52ms</strong> Template: <strong>2ms</strong> © 2017 Gogs Version: 0.10.10.0308 Page: <strong>52ms</strong> Template: <strong>2ms</strong>
</div> </div>
<div class="ui right links"> <div class="ui right links">
<div class="ui language bottom floating slide up dropdown link item"> <div class="ui language bottom floating slide up dropdown link item">
<i class="world icon"></i> <i class="world icon"></i>
<div class="text">English</div> <div class="text">English</div>
<div class="menu"> <div class="menu">
<a class="item active selected" href="#">English</a> <a class="item active selected" href="#">English</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=zh-CN"></a> <a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=zh-CN"></a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=zh-HK"></a> <a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=zh-HK"></a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=zh-TW"></a> <a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=zh-TW"></a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=de-DE">Deutsch</a> <a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=de-DE">Deutsch</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=fr-FR">Français</a> <a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=fr-FR">Français</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=nl-NL">Nederlands</a> <a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=nl-NL">Nederlands</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=lv-LV">Latviešu</a> <a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=lv-LV">Latviešu</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=ru-RU">Русский</a> <a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=ru-RU">Русский</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=ja-JP"></a> <a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=ja-JP"></a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=es-ES">Español</a> <a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=es-ES">Español</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=pt-BR">Português do Brasil</a> <a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=pt-BR">Português do Brasil</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=pl-PL">Polski</a> <a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=pl-PL">Polski</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=bg-BG">български</a> <a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=bg-BG">български</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=it-IT">Italiano</a> <a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=it-IT">Italiano</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=fi-FI">Suomalainen</a> <a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=fi-FI">Suomalainen</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=tr-TR">Türkçe</a> <a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=tr-TR">Türkçe</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=cs-CZ">čeština</a> <a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=cs-CZ">čeština</a>
</div> </div>
</div> </div>
<a href="/assets/librejs/librejs.html" style="display:none" data-jslicense="1">Javascript Licenses</a> <a href="/assets/librejs/librejs.html" style="display:none" data-jslicense="1">Javascript Licenses</a>

View File

@ -19,9 +19,9 @@ void splitFtpRequest(char* pRequest, char* pCommand, char* pContent){
for( i = 0 ; i < strlen(pRequest) && pRequest[i] != '\0' ; i++ ){ for( i = 0 ; i < strlen(pRequest) && pRequest[i] != '\0' ; i++ ){
if( i < firstSpaceIndex ) // première partie (pCommand) if( i < firstSpaceIndex ) // première partie (pCommand)
strcat( pCommand, (char[2]){(char) pRequest[i], '\0'}); strcat( pCommand, (char[2]){(char) pRequest[i], '\0'});
if( i > firstSpaceIndex ) // seconde partie (pContent) if( i > firstSpaceIndex ) // seconde partie (pContent)
strcat( pContent, (char[2]){(char) pRequest[i], '\0'}); strcat( pContent, (char[2]){(char) pRequest[i], '\0'});
} }
@ -42,9 +42,9 @@ void splitFtpResponse(char* pAnswer, char* ftpCode, char* ftpText){
for( i = 0 ; i < strlen(pAnswer) && pAnswer[i] != '\0' ; i++ ){ for( i = 0 ; i < strlen(pAnswer) && pAnswer[i] != '\0' ; i++ ){
if( i < codeLength ) // première partie (ftpCode) if( i < codeLength ) // première partie (ftpCode)
strcat(ftpCode, (char[2]){(char)pAnswer[i], '\0' }); strcat(ftpCode, (char[2]){(char)pAnswer[i], '\0' });
if( i > codeLength ) // seconde partie (ftpText) if( i > codeLength ) // seconde partie (ftpText)
strcat(ftpText, (char[2]){(char)pAnswer[i], '\0' }); strcat(ftpText, (char[2]){(char)pAnswer[i], '\0' });
} }
@ -56,7 +56,7 @@ void splitFtpResponse(char* pAnswer, char* ftpCode, char* ftpText){
int indexOf(char* haystack, char needle){ int indexOf(char* haystack, char needle){
int i; int i;
for( i = 0 ; i < strlen(haystack) && haystack[i] != '\0' ; i++ ) for( i = 0 ; i < strlen(haystack) && haystack[i] != '\0' ; i++ )
if( haystack[i] == needle ) // si on trouve le caractère if( haystack[i] == needle ) // si on trouve le caractère
return i; return i;
@ -97,11 +97,11 @@ int sread(int* pSocket, char* pBuffer){
/* 1. On vide le buffer avant de lire */ /* 1. On vide le buffer avant de lire */
memset(pBuffer, '\0', maxBuffLen); memset(pBuffer, '\0', MAX_BUF_LEN);
if( DEBUGMOD&BUF ) printf("READLEN_1: %lu\n", strlen(pBuffer)); if( DEBUGMOD&BUF ) printf("READLEN_1: %lu\n", strlen(pBuffer));
/* 2. On lit la SOCKET */ /* 2. On lit la SOCKET */
int nbRead = read(*pSocket, pBuffer, maxBuffLen); int nbRead = read(*pSocket, pBuffer, MAX_BUF_LEN);
if( DEBUGMOD&BUF ) printf("READLEN_3: %d\n", nbRead); if( DEBUGMOD&BUF ) printf("READLEN_3: %d\n", nbRead);
@ -127,13 +127,13 @@ void setSocketTimeout(int* pSocket, const int pSec, const int pUSec){
timeout.tv_usec = pUSec; timeout.tv_usec = pUSec;
setsockopt(*pSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(struct timeval)); 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 ); if( DEBUGMOD&SCK ) printf("Set socket(%d) timeout to %lus\n", *pSocket, (long unsigned) timeout.tv_sec );
} }
void xPrint(char* pPattern, char* pBuffer){ void xPrint(char* pPattern, char* pBuffer){
char tmpBuffer[maxBuffLen]; char tmpBuffer[MAX_BUF_LEN];
strcpy(tmpBuffer, pBuffer); strcpy(tmpBuffer, pBuffer);
@ -152,7 +152,7 @@ void xPrint(char* pPattern, char* pBuffer){
void revealString(char* pString){ void revealString(char* pString){
/* 1. On créé une copie de @pString */ /* 1. On créé une copie de @pString */
char revealedString[maxBuffLen] = {0}; char revealedString[MAX_BUF_LEN] = {0};
/* 2. On rend visible tous les caractères "invisibles" */ /* 2. On rend visible tous les caractères "invisibles" */
int i; int i;