Lib tcp/udp in progress
This commit is contained in:
parent
b41a8d304f
commit
94c4769241
|
@ -0,0 +1 @@
|
||||||
|
.vscode
|
|
@ -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
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
|
|
@ -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
|
|
@ -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
|
|
@ -0,0 +1,11 @@
|
||||||
|
#ifndef _LIB_NETWORK_FORMAT_SERIALIZER_H_
|
||||||
|
#define _LIB_NETWORK_FORMAT_SERIALIZER_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include "../../header.h";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
|
@ -0,0 +1 @@
|
||||||
|
../../../global/plane.c
|
|
@ -0,0 +1 @@
|
||||||
|
../../../global/plane.h
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
|
@ -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';
|
||||||
}
|
}
|
|
@ -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);
|
|
@ -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();
|
||||||
|
}
|
|
@ -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;
|
||||||
|
};
|
|
@ -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 "client.h"</li>
|
<td class="lines-code"><pre><code class="c"><ol class="linenums"><li class="L1" rel="L1">#include "client.h"</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'erreur ou pas de getaddrinfo()</li>
|
<li class="L10" rel="L10"> int GETADDRINFO; // contiendra l'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&HDR ) printf("====== CLIENT_SEND(%d, %s, %s) ======\n\n", *pSocket, pRequest, *pAnswer);</li>
|
<li class="L83" rel="L83"> if( DEBUGMOD&HDR ) printf("====== CLIENT_SEND(%d, %s, %s) ======\n\n", *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&BUF ) printf("nbReceived: %d\n", nbRecup);</li>
|
<li class="L105" rel="L105"> if( DEBUGMOD&BUF ) printf("nbReceived: %d\n", nbRecup);</li>
|
||||||
<li class="L106" rel="L106"> if( DEBUGMOD&BUF ) printf("Message: %s\n", *pAnswer);</li>
|
<li class="L106" rel="L106"> if( DEBUGMOD&BUF ) printf("Message: %s\n", *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>
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue