void __fastcall TForm1::Button1Click(TObject *Sender)
{
// ****************************** **************************
// Déclaration 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
SOCKET sock; // init de la variable sock type socket
int tempo; // Variable temporaire de type int
SOCKADDR_IN information_sur_la_source; // Déclaration de la structure des informations lié à l'écoute
SOCKET id_de_la_nouvelle_socket; // Identifiant de la nouvelle socket
int nombre_de_caractere; // Indique le nombre de caractères qui a été reçu ou envoyé
char buffer[65535]; // Tampon contenant les données reçues ou envoyées
// ****************************** **************************
// Initialisation de Winsock
// ****************************** **************************
erreur=WSAStartup(MAKEWORD(2,2 ),&initialisation_win32);
Memo1->Clear();
if (erreur!=0)
{
Memo1->Lines->Add("Desole, je ne peux pas initialiser Winsock");
}
else
{
Memo1->Lines->Add("\nInitialisation de Winsock OK");
}
// ****************************** **************************
// Ouverture d'une Socket
// ****************************** **************************
sock = socket(AF_INET,SOCK_STREAM,0); //création su socket ( STREAM aprés il faut faire accept() ou de connect() et pas DGRAM)
if (sock==INVALID_SOCKET) //test de la validité de la socket
{
Memo1->Lines->Add("\nDesole, je ne peux pas creer la socket");
}
else
{
Memo1->Lines->Add("\nCréation de la socket OK");
}
// ****************************** **************************
// Activation de l'option permettant d'activer l'algorithme de Nagle
// ****************************** **************************
tempo=1;
erreur=setsockopt(sock,IPPROTO _TCP,TCP_NODELAY,(char *)&tempo,sizeof(tempo));
if (erreur!=0)
{
Memo1->Lines->Add("\nDesole, je ne peux pas configurer cette option");
}
else
{
Memo1->Lines->Add("\nConfiguration des options 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=INADDR_ANY; // Ecoute sur toutes les IP locales
information_sur_la_source.sin_ port=htons(23); // Ecoute sur le port 23
erreur=bind(sock,(struct sockaddr*)&information_sur_la_ source,sizeof(information_sur_ la_source));
if (erreur!=0)
{
Memo1->Lines->Add("\nDesole, je ne peux pas ecouter ce port");
}
else
{
Memo1->Lines->Add("\nEcoute du port OK");
}
// ****************************** **************************
// Attente d'ouverture de session
// ****************************** **************************
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(sock,1);
Memo1->Lines->Add("\nattente d'établicement de session TCP");
}
Memo1->Lines->Add("Une session TCP a été établie");
// ****************************** **************************
// Acceptation de la demande d'ouverture de session
// ****************************** **************************
tempo=sizeof(information_sur_l a_source); // Passe par une variable afin d'utiliser un pointeur
id_de_la_nouvelle_socket=accep t(sock,(struct sockaddr*)&information_sur_la_ source,&tempo);
if(id_de_la_nouvelle_socket==I NVALID_SOCKET)
{
Memo1->Lines->Add("\nDesole, je ne peux pas accepter la session TCP");
}
else
{
Memo1->Lines->Add("\nsession TCP OK");
}
// ****************************** **************************
// Reception des données
// ****************************** **************************
nombre_de_caractere=recv(id_de _la_nouvelle_socket,buffer,151 5,0);
if (nombre_de_caractere==SOCKET_E RROR)
{
Memo1->Lines->Add("\nDesole, je n'ai pas recu de donnee");
}
else
{
buffer[nombre_de_caractere]=0; // Permet de fermer le tableau après le contenu des data, car la fonction recv ne le fait pas
Memo1->Lines->Add("\nVoici les donnees : ");
Memo1->Lines->Add(buffer);
}
// ****************************** **************************
// Fermeture de la session TCP Correspondant à la commande connect()
// ****************************** **************************
erreur=shutdown(sock,2); // 2 signifie socket d'émission et d'écoute
if (erreur!=0)
{
Memo1->Lines->Add("\nDesole, je ne peux pas fermer la session TCP");
}
else
{
Memo1->Lines->Add("\nFermeture de session TCP");
}
// ****************************** **************************
// Fermeture de la socket correspondant à la commande socket()
// ****************************** **************************
erreur=closesocket(sock);
if (erreur!=0)
{
Memo1->Lines->Add("\nDesole, je ne peux pas liberer la socket");
}
else
{
Memo1->Lines->Add("\nFermeture de la socket 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)
{
Memo1->Lines->Add("\nDesole, je ne peux pas liberer winsock");
}
else
{
Memo1->Lines->Add("\nLiberation de winsock OK");
}
Partager