Chapitre 1: Connexion par socket
Ce chapitre n'est compatible que pour windows!
Création du projet
D'abord, vous devez créer votre projet et linker à votre projet le fichier "ws2_32.a" qui est normalement dans le dossier lib de votre compilateur.
Ensuite, vous devez inclure la librairie winsock2.h
Voici donc le code:
Code C:#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
int main()
{
//le code
return 0;
}
Démarrage de la librairie
Bon maintenant, on doit démarrer la librairie.
Pas très compliqué, on créé une variable de type WSADATA et on envoi son adresse à la fonction WSAStartup()
Voici le code à mettre dans le main:
Code C:WSADATA Data; //création de la variable de type WSADATA
WSAStartup(MAKEWORD(2,0), &Data); //on envoi l'addresse de la variable crée ci-dessus
Bon aller un petit récapitulatif du code depuis le départ:
Code C:#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
int main()
{
//démarrage de la librairie
WSADATA Data;
WSAStartup(MAKEWORD(2,0), &Data);
//initialisation des variables
return 0;
}
Initialisation des variables de connexion
Bon maintenant, nous entrons dans la partie principal, l'initialisation des variables de connexion.
Code C:SOCKET sock; //création d'une variable de type SOCKET
sock = socket(AF_INET, SOCK_STREAM, 0); //on initialise la variable sock créé ci-dessus
SOCKADDR_IN connect; //création d'une variable de structure pour se connecter au serveur
//initialisation des variables de connexion
connect.sin_addr.s_addr = inet_addr("127.0.0.1"); //l'adresse ip de la machine auxquel vous voulez vous connecter. 127.0.0.1 est la machine local donc la votre
connect.sin_port = htons(50000); //on ouvre le port 50000
connect.sin_family = AF_INET; //on fait une connexion par Internet. Les programmeurs mettent en général AF_INET
Je crois que c'est assez simple quand même mais pas toujours facile à retenir au début.
Je pense que ce code est assez commenté donc vous avez probablement besoin d'aucune explication sauf pour le port peut-être.
Le port sert à se connecter à la machine distante... c'est en quelque sorte une porte d'entrée. Si c'est fermé, votre ordinateur ne pourra pas se connecter sur la machine distante.
Prenons un exemple dans la vie courante.
Vous voulez aller chez votre voisin regarder la télé avec lui.
Vous pouvez essayer de rentrer mais tant que sa porte d'entrée est fermée, vous ne saurez pas rentrer dans sa maison.
Il faut qu'il vous ouvre la porte pour que vous puissiez rentrer dans sa maison.
Et ben en informatique, c'est exactement la même chose.
port = porte.
Donc si le port est ouvert, vous pourrez vous connecter.
Dans le code ci-dessus, connect.sin_port va ouvrir un port comme ça, vous pourrez vous connecter.
Voici un récapitulatif du code depuis le début:
Code C:#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
int main()
{
//démarrage de la librairie
WSADATA Data;
WSAStartup(MAKEWORD(2,0), &Data);
//création du socket
SOCKET sock;
sock = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN connect;
//initialisation des variables
connect.sin_addr.s_addr = inet_addr("127.0.0.1");
connect.sin_port = htons(50000);
connect.sin_family = AF_INET;
return 0;
}
Client ou serveur
Bon maintenant, il faut que vous sachez c'est quoi un client et un serveur et qu'elle est la différence entre les deux.
Le client est le programme qui se connecte à la machine distante, au serveur.
Le serveur est le programme qui ouvre le port pour pouvoir se connecter dessus.
Donc, grace au serveur, le client peut se connecter dessus.
Si vous n'avez pas compris, la différence entre client et serveur, rendez vous immédiatement
sur le forum poser votre question.
Création d'un serveur
On va créer le serveur en premier temps et en deuxième temps le client.
Donc, le serveur va permettre la connexion et donc ouvrir les ports.
Etant donné qu'il n'y aura pas beaucoup de nouveauté, je met tout le code d'un coup.
Code C:#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
int main()
{
WSADATA Data;
WSAStartup(MAKEWORD(2,0), &Data);
SOCKET sock;
SOCKET sock2;
sock = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN connect;
SOCKADDR_IN connect2;
connect.sin_family = AF_INET;
connect.sin_addr.s_addr = INADDR_ANY; //accepte toutes les ips entrantes
connect.sin_port = htons(50000);
bind(sock, (SOCKADDR *)&connect, sizeof(connect));
listen(sock, 0);
while(1)//on fait une boucle infinie
{
if((sock2 = accept(sock, (SOCKADDR *)&connect2, sizeof(connect2))) != INVALID_SOCKET)
{
//la connexion a été accepté, on peut envoyer des données
send(sock2, "test", 4, 0);
}
}
return 0;
}
Explication sur le code:
Il y a eu quelques nouveautés comme vous l'avez vu.
On à créé une 2ème variable de type SOCKET et une autre 2ème variables de type SOCKADDR_IN: sock2 et connect2, ça nous servira pour la acceptation de connexion et l'envoi de données.
Mais encore...
Code C:bind(sock, (SOCKADDR *)&connect, sizeof(connect));
listen(sock, 0);
la fonction bind prend en argument la première variable de type SOCKET et en deuxième argument, c'est plus compliqué, mais en tout cas, vous envoyer l'addresse mémoire de la première variable de type SOCKADDR_IN.
Enfin, en 3ème argument, vous envoyer la taille de la variable connect.
La fonction listen permet de mettre sur écoute donc de se connecter.
Ensuite, on insère dans une boucle la fonction accept()
Tant que la connexion ne sera pas accepté, il va refaire la boucle.
ensuite, si la connexion a été accepté, on peut envoyer des données au client avec la fonction send().
send demande en premier argument la variable de type SOCKET qui à été créé en deuxième temps.
En deuxième argument, on met le texte à envoyer. Dans ce cas, il enverra "test" à l'ordinateur distant.
En troisième paramètre, vous mettez la taille que prend votre texte.
enfin, le dernier paramètre, mettez 0, inutile de compliquer les choses.
Création d'un client
Rassurez vous tout de suite, ce sera plus facile que la création de serveur.
De nouveau, je met directement tout le code afin de ne pas compliquer les choses.
Code C:#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
int main()
{
WSADATA Data;
WSAStartup(MAKEWORD(2,0), &Data);
long mem;
SOCKET sock;
SOCKADDR_IN connect;
sock = socket(AF_INET, SOCK_STREAM, 0);
connect.sin_addr.s_addr = inet_addr("53.25.78.253"); //connexion sur l'ip 53.25.78.253
connect.sin_port = htons(50000);
connect.sin_family = AF_INET;
connect(sock, (SOCKADDR *)&connect, sizeof(connect));
recv(sock, mem, sizeof(mem), 0);
return 0;
}
