193 lines
7.0 KiB
C
193 lines
7.0 KiB
C
|
#include "client.h"
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
void CLIENT_REQUEST(char* serverHost, char* serverPort, char* pRequest, char** pAnswer){
|
||
|
if( DEBUGMOD ) printf("====== CLIENT_REQUEST(%s, %s, %s, %s) ======\n\n", serverHost, serverPort, pRequest, *pAnswer);
|
||
|
|
||
|
struct addrinfo hints; // contiendra le filtre/format
|
||
|
struct addrinfo* addrinfo; // contiendra les infos
|
||
|
int SOCKET, CONNECT; // file_desc(s)
|
||
|
char BUFFER[maxBuffLen]; // BUFFER de communication
|
||
|
// char pAnswer[maxBuffLen] = {0}; // on vide la réponse (contiendra la réponse du serveur)
|
||
|
|
||
|
/* [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 = 0; // non spécifié
|
||
|
hints.ai_protocol = 0; // non spécifié
|
||
|
|
||
|
if( DEBUGMOD ) printf("============HINTS===========\n");
|
||
|
if( DEBUGMOD ) printf( "AI_FLAGS = %d\n", hints.ai_flags ); // int
|
||
|
if( DEBUGMOD ) printf( "AI_FAMILY = %d\n", hints.ai_family ); // int
|
||
|
if( DEBUGMOD ) printf( "AI_SOCKTYPE = %d\n", hints.ai_socktype ); // int
|
||
|
if( DEBUGMOD ) printf( "AI_PROTOCOL = %d\n", hints.ai_protocol ); // int
|
||
|
if( DEBUGMOD ) printf( "AI_ADDRLEN = %d\n", hints.ai_addrlen ); // int
|
||
|
if( DEBUGMOD ) printf("\n");
|
||
|
|
||
|
|
||
|
/* [2] On récupère les infos
|
||
|
=======================================================*/
|
||
|
getaddrinfo(serverHost, serverPort, &hints, &addrinfo);
|
||
|
|
||
|
if( DEBUGMOD ) printf("=============RES============\n");
|
||
|
if( DEBUGMOD ) printf( "AI_FLAGS = %d\n", addrinfo->ai_flags ); // int
|
||
|
if( DEBUGMOD ) printf( "AI_FAMILY = %d\n", addrinfo->ai_family ); // int
|
||
|
if( DEBUGMOD ) printf( "AI_SOCKTYPE = %d\n", addrinfo->ai_socktype ); // int
|
||
|
if( DEBUGMOD ) printf( "AI_PROTOCOL = %d\n", addrinfo->ai_protocol ); // int
|
||
|
if( DEBUGMOD ) printf( "AI_ADDRLEN = %d\n", addrinfo->ai_addrlen ); // int
|
||
|
if( DEBUGMOD ) printf("\n");
|
||
|
|
||
|
/* [3] Création de la socket
|
||
|
=======================================================*/
|
||
|
SOCKET = socket(addrinfo->ai_family, addrinfo->ai_socktype, 0);
|
||
|
|
||
|
if( DEBUGMOD ) printf("SOCKET = %d\n", SOCKET);
|
||
|
|
||
|
// si erreur
|
||
|
if( SOCKET == -1 ) return;
|
||
|
|
||
|
/* [4] On établit la connection
|
||
|
=======================================================*/
|
||
|
CONNECT = connect(
|
||
|
SOCKET,
|
||
|
addrinfo->ai_addr,
|
||
|
addrinfo->ai_addrlen
|
||
|
);
|
||
|
|
||
|
if( DEBUGMOD ) printf("CONNECT = %d\n", CONNECT);
|
||
|
|
||
|
// si erreur
|
||
|
if( CONNECT == -1 ) return;
|
||
|
|
||
|
// on a plus besoin des infos de l'adresse
|
||
|
freeaddrinfo(addrinfo);
|
||
|
|
||
|
|
||
|
/* [5] On écrit sur la socket
|
||
|
=======================================================*/
|
||
|
int nbSend = swrite(&SOCKET, pRequest);
|
||
|
|
||
|
if( DEBUGMOD ) printf("nbSend: %d\n", nbSend);
|
||
|
if( DEBUGMOD ) printf("Message: %s\n", pRequest);
|
||
|
|
||
|
// si pas tout envoyé
|
||
|
if( strlen(pRequest) != nbSend ) return;
|
||
|
|
||
|
/* [6] On lit la réponse
|
||
|
=======================================================*/
|
||
|
// memset(BUFFER, '\0', sizeof(BUFFER)); // on vide le buffer
|
||
|
int nbRecup = sread(&SOCKET, BUFFER);
|
||
|
|
||
|
*pAnswer = malloc( sizeof(BUFFER) );
|
||
|
strcpy(*pAnswer, BUFFER);
|
||
|
|
||
|
if( DEBUGMOD ) printf("nbReceived: %d\n", nbRecup);
|
||
|
if( DEBUGMOD ) printf("Message: %s\n", *pAnswer);
|
||
|
|
||
|
|
||
|
/* [7] On ferme la connection
|
||
|
=======================================================*/
|
||
|
int closeState = close(SOCKET);
|
||
|
|
||
|
// if( closeState == -1 ) return;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
void CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket){
|
||
|
if( DEBUGMOD ) printf("====== INIT_CLIENT(%s, %s, %d) ======\n\n", serverHost, serverPort, *pSocket);
|
||
|
|
||
|
struct addrinfo hints; // contiendra le filtre/format
|
||
|
struct addrinfo* addrinfo; // contiendra les infos
|
||
|
int CONNECT; // file_desc(s)
|
||
|
char BUFFER[maxBuffLen]; // BUFFER de communication
|
||
|
// char pAnswer[maxBuffLen] = {0}; // on vide la réponse (contiendra la réponse du serveur)
|
||
|
|
||
|
/* [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 = 0; // non spécifié
|
||
|
hints.ai_protocol = 0; // non spécifié
|
||
|
|
||
|
if( DEBUGMOD ) printf("============HINTS===========\n");
|
||
|
if( DEBUGMOD ) printf( "AI_FLAGS = %d\n", hints.ai_flags ); // int
|
||
|
if( DEBUGMOD ) printf( "AI_FAMILY = %d\n", hints.ai_family ); // int
|
||
|
if( DEBUGMOD ) printf( "AI_SOCKTYPE = %d\n", hints.ai_socktype ); // int
|
||
|
if( DEBUGMOD ) printf( "AI_PROTOCOL = %d\n", hints.ai_protocol ); // int
|
||
|
if( DEBUGMOD ) printf( "AI_ADDRLEN = %d\n", hints.ai_addrlen ); // int
|
||
|
if( DEBUGMOD ) printf("\n");
|
||
|
|
||
|
|
||
|
/* [2] On récupère les infos
|
||
|
=======================================================*/
|
||
|
getaddrinfo(serverHost, serverPort, &hints, &addrinfo);
|
||
|
|
||
|
if( DEBUGMOD ) printf("=============RES============\n");
|
||
|
if( DEBUGMOD ) printf( "AI_FLAGS = %d\n", addrinfo->ai_flags ); // int
|
||
|
if( DEBUGMOD ) printf( "AI_FAMILY = %d\n", addrinfo->ai_family ); // int
|
||
|
if( DEBUGMOD ) printf( "AI_SOCKTYPE = %d\n", addrinfo->ai_socktype ); // int
|
||
|
if( DEBUGMOD ) printf( "AI_PROTOCOL = %d\n", addrinfo->ai_protocol ); // int
|
||
|
if( DEBUGMOD ) printf( "AI_ADDRLEN = %d\n", addrinfo->ai_addrlen ); // int
|
||
|
if( DEBUGMOD ) printf("\n");
|
||
|
|
||
|
/* [3] Création de la socket
|
||
|
=======================================================*/
|
||
|
*pSocket = socket(addrinfo->ai_family, addrinfo->ai_socktype, 0);
|
||
|
|
||
|
if( DEBUGMOD ) printf("SOCKET = %d\n", *pSocket);
|
||
|
|
||
|
// si erreur
|
||
|
if( *pSocket == -1 ) return;
|
||
|
|
||
|
/* [4] On établit la connection
|
||
|
=======================================================*/
|
||
|
CONNECT = connect(
|
||
|
*pSocket,
|
||
|
addrinfo->ai_addr,
|
||
|
addrinfo->ai_addrlen
|
||
|
);
|
||
|
|
||
|
if( DEBUGMOD ) printf("CONNECT = %d\n", CONNECT);
|
||
|
|
||
|
// si erreur
|
||
|
if( CONNECT == -1 ) return;
|
||
|
|
||
|
// on a plus besoin des infos de l'adresse
|
||
|
freeaddrinfo(addrinfo);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer){
|
||
|
char BUFFER[maxBuffLen] = {'\0'};
|
||
|
|
||
|
/* [5] On écrit sur la socket
|
||
|
=======================================================*/
|
||
|
int nbSend = swrite(pSocket, pRequest);
|
||
|
|
||
|
if( DEBUGMOD ) printf("nbSend: %d\n", nbSend);
|
||
|
if( DEBUGMOD ) printf("Message: %s\n", pRequest);
|
||
|
|
||
|
// si pas tout envoyé
|
||
|
if( strlen(pRequest) != nbSend ) return;
|
||
|
|
||
|
/* [6] On lit la réponse
|
||
|
=======================================================*/
|
||
|
int nbRecup = sread(pSocket, BUFFER);
|
||
|
|
||
|
*pAnswer = malloc( sizeof(BUFFER) );
|
||
|
strcpy(*pAnswer, BUFFER);
|
||
|
|
||
|
if( DEBUGMOD ) printf("nbReceived: %d\n", nbRecup);
|
||
|
if( DEBUGMOD ) printf("Message: %s\n", *pAnswer);
|
||
|
}
|