Les sockets permettent de communiquer par internet ou en local en passant par des ports.
Les includes :
Adaptez ws2_32.lib en wsock32.lib si vous utilisez winsock.h
#include <winsock2.h>
#include <string.h> // Pour strcpy
#include <stdio.h> // Pour printf
#pragma comment(lib,"ws2_32.lib");
Initialisation du WSA (winsock) :
Ici aussi, adaptez 2,2 suivant la version utilisée.
int main() {
WSADATA wsadata;
WSAStartup(MAKEWORD(2,2),&wsadata);
Création de la socket (client) :
|
Création de la socket d'écoute (serveur) :
|
| 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) :
|
Test du port, attente d'un SYN et accept(); (serveur) :
|
| 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) :
|
Réception des données (serveur) :
|
| 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 ;-)