[C++] - Les sockets sous Windows

Ecrit par tchess, le 28 Oct 2004 dans la catégorie Programmation

Qu'est-ce que c'est ?

Les sockets permettent de communiquer par internet ou en local en passant par des ports.

On commence


Les includes :
#include <winsock2.h>
#include <string.h> // Pour strcpy
#include <stdio.h> // Pour printf

#pragma comment(lib,"ws2_32.lib");
Adaptez ws2_32.lib en wsock32.lib si vous utilisez winsock.h

Initialisation du WSA (winsock) :
int main() {
WSADATA wsadata;
WSAStartup(MAKEWORD(2,2),&wsadata);
Ici aussi, adaptez 2,2 suivant la version utilisée.

Création de la socket (client) :
SOCKET sock;
SOCKADDR_IN sin;
sock = socket(AF_INET, SOCK_STREAM, 0);
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr("127.0.0.1");
sin.sin_addr.s_addr = htons(19);
Création de la socket d'écoute (serveur) :
SOCKET sock;
SOCKADDR_IN sin;
sock = socket(AF_INET, SOCK_STREAM, 0);
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(19);
La socket sock a été créée ainsi qu'un objet sin
de type SOCKADDR_IN qui sera utilisé
lors de la connection, configuré pour se
connecter lui-même sur le port 19.
On utilise inet_addr pour transformer
la chaîne de caractère en un entier de 32bits.
Une socket a été créé ainsi que l'objet sin qui est configuré pour écouter le port 19 sur toutes les adresses IP (INADDR_ANY).



Test du port et envoi d'un SYN (client) :
int test = bind(sock, (struct sockaddr*)&sin, sizeof(sin));
if(test!=0) { exit(0); closesocket(sock); }
test=99;
while(test!=0) { test=listen(sock,1); }
connect(sock, (struct sockaddr*)&sin, sizeof(sin));
Test du port, attente d'un SYN et accept(); (serveur) :
int test = bind(sock, (struct sockaddr*)&sin, sizeof(sin));
if(test!=0) { exit(0); }
test=99;
while(test!=0) { test=listen(sock,1); }
SOCKET nsock = accept(sock, (struct sockaddr*)&sin, sizeof(sin));
La fonction bind() renvoie 0 si on peut utiliser ce port.
Envoi d'un paquet SYN (demande de connection). On écoute sur le port 19 avec listen() jusqu'à ce qu'elle retourne 0 donc qu'un SYN ai été recu.
Elle renvoie un paquet SYN/ACK qui confirme le recu du SYN et un ACK sera ensuite envoyé par le client.
Une nouvelle socket (nsock) est créée pour envoyer des données sur le client.



Envoi de données (client) :
char *buffer;
strcpy(buffer,"Salut, ca va ?");
send(sock,buffer,strlen(buffer),0);
Réception des données (serveur) :
char buffer[65535];
int nb = recv(nsock,buffer,sizeof(buffer),0);
buffer[nb] = 0;
printf("Les données : %s", buffer);
On envoie des données au serveur avec send(),
et strlen() sert à récupérer la taille du buffer.
nb contient le nombre de caractères envoyés. On met donc le (nb+1)ème octet à zéro pour définir la fin du tableau.
On recoit par la socket créée avec accept().



Ensuite on ferme les sockets :
// Pour le serveur :
shutdown(nsock,2); //envoi un paquet RST (fin de connection)
closesocket(nsock); //fermeture du socket
// Pour les deux :
closesocket(sock);

WSACleanup();


Si vous avez des questions allez sur le forum ;-)

Si vous avez un commentaire à faire à l'auteur de cet article, cliquez ici !