Skip to content

Instantly share code, notes, and snippets.

@yvan-sraka
Created March 13, 2018 08:37
Show Gist options
  • Save yvan-sraka/0dc76737b8a327158dfd4a0fc3866100 to your computer and use it in GitHub Desktop.
Save yvan-sraka/0dc76737b8a327158dfd4a0fc3866100 to your computer and use it in GitHub Desktop.
// ********************************************************
// 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