#include "tcp_client.h"
Tcp_client::Tcp_client() {
tempo = WSAStartup ( MAKEWORD(2,2), &wsadata );
if ( tempo != 0 ) {
wcout<< L"Erreur de chargement de la bibliothèque dynamique 'ws2_32.dll'"<<endl;
Affiche_Erreurs( WSAGetLastError() );
}
else {
wcout<< L"La bibliothèque dynamique de type WinSock2 'ws2_32.dll' est bien chargée ..."<<endl;
}
this->wsock = -1;
this->port = 0;
this->adresse_ip = "";
std::locale::global(std::locale(""));
setlocale( LC_ALL, ".OCP" );
cout << "1: Code Page = " << locale().name().c_str() << " OCP = " << GetConsoleOutputCP() << endl;
wcout << L"çà a fonctionné !!!" << endl;
wcout << L"[+] éconstructeur classe TCP_Client" << endl;
}
Tcp_client::~Tcp_client() {
shutdown(wsock,1);
closesocket(wsock);
WSACleanup();
this->wsock = -1;
this->port = 0;
this->adresse_ip = "";
wcout << L"[-] édestructeur classe TCP_Client" << endl;
}
string Tcp_client::Tcp_client_init() {
char buffer[64]={0};
//struct in_addr MonAdresse; // <-- structure dans la classe
struct hostent *hote;
if ( gethostname (buffer, 64) == SOCKET_ERROR ) {
wcout << L"erreur dûe à gethostname() référencée : ";
cout << WSAGetLastError() << endl;
Affiche_Erreurs( WSAGetLastError() );
string err = "erreur due a gethostname()";
return err.c_str();
}
if ( (hote = gethostbyname (buffer)) == NULL ) {
wcout << L"erreur dûe à gethostbyname() référencée : ";
cout << WSAGetLastError() << endl;
Affiche_Erreurs( WSAGetLastError() );
string err = "erreur due a gethostbyname()";
return err.c_str();
}
memcpy (&this->MonAdresse.s_addr, hote->h_addr_list[0], sizeof this->MonAdresse.s_addr );
//memcpy ((char*)reply.c_str(), MonAdresse.s_addr);
cout << "adresse ip du serveur TCP = "<< inet_ntoa(this->MonAdresse)<<endl;
string reply = "adresse ip correctementlue par gethostname() et gethostbyname()";
return reply.c_str();
}
/** Connect to a host on a certain port number */
bool Tcp_client::Tcp_connect( string address, unsigned short port) {
// string ip;
//create socket if it is not already created
if(this->wsock == -1) {
// Create new socket
this->wsock = socket ( AF_INET, SOCK_STREAM, 0);
if (this->wsock == -1) {
//perror("Could not create socket");
wcout << L"\nDesolé, je n'ai pas pu créé le socket en mode TCP : erreur référencée ";
cout << WSAGetLastError() << endl;
Affiche_Erreurs( WSAGetLastError() );
return false;
}
else wcout<< L"La nouvelle création du socket en mode TCP est réussie !\n";
}
else {
wcout << L"\nDesolé, pas réussi à créer le socket mode TCP : socket déjà existant !!! ";
return false;
}
tempo = 1;
// erreur = setsockopt ( Listening_Socket, IPPROTO_TCP, SO_REUSEADDR, (char *)&tempo, sizeof(tempo));
erreur = setsockopt ( this->wsock, IPPROTO_TCP, TCP_NODELAY, (char *)&tempo, sizeof(tempo));
// options sockets SO_REUSEPORT | SO_REUSEADDR
if (erreur != 0) {
Affiche_Erreurs( WSAGetLastError() );
cout<<"Erreur dans la fonction setsockopt() " << endl;
}
else
cout<<"setsockopt() : OK"<<endl;
//setup address structure
if ( inet_addr ( address.c_str()) == -1) {
struct hostent *he;
struct in_addr **addr_list;
//resolve the hostname, its not an ip address
if ( ( he = gethostbyname ( address.c_str() ) ) == NULL) {
// gethostbyname failed
// perror("gethostbyname");
//cout << "Failed to resolve hostname\n";
wcout << L"\nDesolé, pas réussi à résoudre gethostbyname(): erreur référencée ";
cout << WSAGetLastError() << endl;
Affiche_Erreurs( WSAGetLastError() );
return false;
}
// Cast the h_addr_list to in_addr , since h_addr_list also has the ip address in long format only
addr_list = (struct in_addr **) he->h_addr_list;
for ( int i = 0; addr_list[i] != NULL; i++) {
// strcpy(ip , inet_ntoa(*addr_list[i]) );
this->server.sin_addr = *addr_list[i];
// server.sin_addr.s_addr = htonl(inet_ntoa(*addr_list[i]));
//memcpy ( &this->server.sin_addr.s_addr, inet_addr(he->h_addr_list[i]), he->h_length);
//memcpy ( &this->server.sin_addr.s_addr, inet_addr("74.125.230.248"), he->h_length);
//this->server.sin_addr.s_addr = inet_addr("74.125.230.248");
cout << "1: " << address << " resolved to " << inet_ntoa(*addr_list[i]) << endl;
cout << "2: " << address << " adresse IP locale = " << inet_ntoa(this->server.sin_addr) << endl;
// cout << "3: " << address << " adresse IP locale = " << inet_ntoa(this->server.sin_addr) << endl;
// break;
}
}
// if plain ip address
else {
wcout << L"3.0: je passe par là pour compléter le champ adresse ip ... locale ..."<<endl;
//tcp_client1..sin_addr.s_addr = inet_addr(inet_ntoa(this->MonAdresse));
this->server.sin_addr.s_addr = inet_addr(inet_ntoa(this->MonAdresse));
//this->server.sin_addr.s_addr = inet_addr( address.c_str() );
}
cout << "4.0: " << address << " adresse IP locale = " << inet_ntoa(this->server.sin_addr) << endl;
this->server.sin_addr.s_addr = inet_addr(inet_ntoa(this->MonAdresse));
this->server.sin_family = AF_INET;
this->server.sin_port = htons(port);
cout << "44.0: " << address << " adresse IP locale = " << inet_ntoa(this->server.sin_addr) << endl;
//Connect to remote server
if ( connect ( this->wsock , (struct sockaddr *)&this->server, sizeof(this->server)) != 0) {
//perror("1: connect failed. Error\n");
wcout << L"\nDesolé, pas réussi à ouvrir la session TCP : erreur référencée ";
cout << WSAGetLastError() << endl;
Affiche_Erreurs( WSAGetLastError() );
return false;
}
wcout << L"Connecté ... au serveur HTTP !" << endl ;
return true;
}
/** Send data to the connected host */
bool Tcp_client::Tcp_send_data ( string data ) {
// Send some data
if( send ( this->wsock, data.c_str(), data.size(), 0) < 0) {
//perror("Send failed : ");
wcout << L"erreur lors de la phase répétition émission = ";
cout << WSAGetLastError() << endl;
Affiche_Erreurs( WSAGetLastError() );
return false;
}
// cout<<"\nData send : " << data.c_str() << endl;
return true;
}
/** Receiving data from the connected host */
string Tcp_client::Tcp_receive_data() {
char buffer[TAILLE+16]={0};
//string buffer;
//char * buffer = new char [TAILLE];
string reply;
reply.empty();
// Receive a reply from the server
if( recv ( this->wsock, buffer, TAILLE, 0) < 0) {
//puts("recv failed");
wcout << L"erreur de réception = ";
cout << WSAGetLastError() << endl;
Affiche_Erreurs( WSAGetLastError() );
string err = "erreur de reception";
return err.c_str();
}
else
reply = buffer;
//delete [] buffer;
return reply.c_str();
}
bool Tcp_client::Tcp_lecture_fichier(string filename) {
ifstream fichier; // <-- visual C 6.0 <-- le 16 décembre 2013
int n , cpt=0;
char * buff = NULL;
int k=0, tailletotale=0;
fichier.open ( (char*)filename.c_str(), ios::binary);
if ( fichier.fail() ) {
wcout<<L"problème d'ouverture du fichier en mode lecture ..."<<endl;
cout<<filename<<endl;
Affiche_Erreurs( GetLastError() );
return false;
}
fichier.clear();
fichier.seekg( 0, ios::end ); // déplacer le pointeur fichier à la fin du fichier
n = (int) fichier.tellg(); // récupérer la taille du fichier
cout <<"taille estimee du fichier = " << n << " octets sur "<< sizeof n << " octets"<<endl;
fichier.seekg(0, ios::beg); // remettre le pointeur fichier au début
// créér l'allocation dynamique en mémoire du buffer de lecture ... avec new
// lecture du fichier par bloc de taille SECTEUR octets
buff = new char [SECTEUR];
cout << "taille du buffer = " << sizeof buff << " octets et SECTEUR = " << SECTEUR << endl;
// 1: envoi du nom du fichier
Nb_Carac = send ( this->wsock, (char*)filename.c_str(), (int)filename.size(), 0);
//Nb_Carac = send ( this->Working_Socket, (char*)filename.c_str(), 8, 0);
cout<<"envoi nom de fich