Created
March 13, 2018 08:37
-
-
Save yvan-sraka/0dc76737b8a327158dfd4a0fc3866100 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ******************************************************** | |
// Les includes | |
// ******************************************************** | |
#include <winsock2.h> // pour les fonctions socket | |
#include <cstdio> // Pour les Sprintf | |
#include <stdio.h> // Pour les Sprintf | |
#include <string> | |
#include <iostream> | |
using namespace std; | |
// ******************************************************** | |
// Les librairies | |
// ******************************************************** | |
#pragma comment(lib,"ws2_32.lib") | |
// ******************************************************** | |
// Définition des variables | |
// ******************************************************** | |
WSADATA initialisation_win32; // Variable permettant de r�cup�rer la structure d'information sur l'initialisation | |
int erreur; // Variable permettant de r�cup�rer la valeur de retour des fonctions utilis�es | |
int tempo; // Variable temporaire de type int | |
int nombre_de_caractere; // Indique le nombre de caract�res qui a �t� re�u ou envoy� | |
// Tampon contenant les donn�es re�ues ou envoy�es | |
SOCKET id_de_la_socket; // Identifiant de la socket | |
SOCKET id_de_la_nouvelle_socket; // Identifiant de la nouvelle socket | |
SOCKADDR_IN information_sur_la_source; // D�claration de la structure des informations li� � l'�coute | |
struct thread_param{ | |
SOCKET soc; | |
}; | |
DWORD ClientThread(SOCKET soc){ | |
// ******************************************************** | |
// Reception des données | |
// ******************************************************** | |
bool run = true; | |
while(run){ | |
char buffer[65535]; | |
nombre_de_caractere=recv(soc,buffer,sizeof(buffer),0); | |
if(nombre_de_caractere == SOCKET_ERROR)break; | |
buffer[nombre_de_caractere]=0; // Permet de fermer le tableau apr�s le contenu des data, car la fonction recv ne le fait pas | |
printf("\nVoici les donnees : %s",buffer); | |
if(strcmp(buffer, "bye") == 0) run = false; | |
} | |
run = true; | |
// ******************************************************** | |
// Fermeture de la session TCP Correspondant à la commande connect() | |
// ******************************************************** | |
erreur=shutdown(soc,2); // 2 signifie socket d'émission et d'écoute | |
if (erreur!=0) | |
printf("\nDesole, je ne peux pas fermer la session TCP du a l'erreur : %d %d",erreur,WSAGetLastError()); | |
else | |
printf("\nshutdown : OK"); | |
// ******************************************************** | |
// Fermeture des deux socket correspondant à la commande socket() et accept() | |
// ******************************************************** | |
erreur=closesocket(soc); | |
if (erreur!=0) | |
printf("\nDesole, je ne peux pas liberer la socket du a l'erreur : %d %d",erreur,WSAGetLastError()); | |
else | |
printf("\nclosesocket : OK"); | |
return 0; | |
} | |
static DWORD WINAPI ThreadLauncher(void *p){ | |
struct thread_param *Obj = reinterpret_cast<struct thread_param*>(p); | |
return ClientThread(Obj->soc); | |
} | |
int main (int argc, char* argv[]) | |
{ | |
// ******************************************************** | |
// Initialisation de Winsock | |
// ******************************************************** | |
erreur=WSAStartup(MAKEWORD(2,2),&initialisation_win32); | |
if (erreur!=0) | |
printf("\nDesole, je ne peux pas initialiser Winsock du a l'erreur : %d %d",erreur,WSAGetLastError()); | |
else | |
printf("\nWSAStartup : OK"); | |
// ******************************************************** | |
// Ouverture d'une Socket | |
// ******************************************************** | |
id_de_la_socket=socket(AF_INET,SOCK_STREAM,0); | |
if (id_de_la_socket==INVALID_SOCKET) | |
printf("\nDesole, je ne peux pas creer la socket du a l'erreur : %d",WSAGetLastError()); | |
else | |
printf("\nsocket : OK"); | |
// ******************************************************** | |
// Activation de l'option permettant d'activer l'algorithme de Nagle | |
// ******************************************************** | |
tempo=1; | |
erreur=setsockopt(id_de_la_socket,IPPROTO_TCP,TCP_NODELAY,(char *)&tempo,sizeof(tempo)); | |
if (erreur!=0) | |
printf("\nDesole, je ne peux pas configurer cette options du � l'erreur : %d %d",erreur,WSAGetLastError()); | |
else | |
printf("\nsetsockopt : OK"); | |
// ******************************************************** | |
// Lie la socket à une ip et un port d'écoute | |
// ******************************************************** | |
information_sur_la_source.sin_family=AF_INET; | |
information_sur_la_source.sin_addr.s_addr = inet_addr("192.168.1.168");// INADDR_ANY; // Ecoute sur toutes les IP locales | |
information_sur_la_source.sin_port=htons(33333); // Ecoute sur le port 33333 | |
erreur=bind(id_de_la_socket,(struct sockaddr*)&information_sur_la_source,sizeof(information_sur_la_source)); | |
if (erreur!=0) | |
printf("\nDesole, je ne peux pas ecouter ce port : %d %d",erreur,WSAGetLastError()); | |
else | |
printf("\nbind : OK"); | |
// ******************************************************** | |
// Attente d'ouverture de session | |
// ******************************************************** | |
HANDLE hProcessThread; | |
while(true){ | |
int iThread = 0; | |
erreur=99; // Initiation de erreur pour être sur que l'on va rentrer dans la boucle | |
while(erreur!=0) // Boucle tant qu'une demande de session (SYN) tcp n'a pas été reçu | |
erreur=listen(id_de_la_socket,1); | |
printf("\nlisten : OK"); | |
// ******************************************************** | |
// Acceptation de la demande d'ouverture de session | |
// ******************************************************** | |
printf("\nAttente de la reception de demande d'ouverture de session tcp (SYN)"); | |
tempo=sizeof(information_sur_la_source); // Passe par une variable afin d'utiliser un pointeur | |
id_de_la_nouvelle_socket=accept(id_de_la_socket,(struct sockaddr*)&information_sur_la_source,&tempo); | |
///création du thread!! | |
struct thread_param p; | |
p.soc = id_de_la_nouvelle_socket; | |
hProcessThread = CreateThread(NULL, 0,&ThreadLauncher, &p,0,NULL); | |
} | |
///ferme le socket serveur | |
erreur=closesocket(id_de_la_socket); | |
if (erreur!=0) | |
printf("\nDesole, je ne peux pas liberer la socket du a l'erreur : %d %d",erreur,WSAGetLastError()); | |
else | |
printf("\nclosesocket : OK"); | |
// ******************************************************** | |
// Quitte proprement le winsock ouvert avec la commande WSAStartup | |
// ******************************************************** | |
erreur=WSACleanup(); // A appeler autant de fois qu'il a été ouvert. | |
if (erreur!=0) | |
printf("\nDesole, je ne peux pas liberer winsock du a l'erreur : %d %d",erreur,WSAGetLastError()); | |
else | |
printf("\nWSACleanup : OK"); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment