C'est quoi un socket? Ou y a t-il un bon tutorial?

Slown Messages postés 37 Date d'inscription lundi 14 mars 2005 Statut Membre Dernière intervention 20 mai 2009 - 4 janv. 2006 à 20:14
Biting Messages postés 1 Date d'inscription dimanche 10 octobre 2004 Statut Membre Dernière intervention 12 février 2007 - 12 févr. 2007 à 13:56
Bien le bonjour! Je voudrais savoir a quoi servent les socket (ou winsock). J'voi partout des tutz sur ça mais on dit jamais a quoi ça sert concretement. Donc voila, si vous pouviez eclairer ma lanterne ça serait gantil. Un exemple concret serait appreciable. Sinon connaitriez vous des tutoriaux qui expliquent ce domaine de A à Z? Ou même un livre pourquoi pas?
J'vous remercie de votre attention, ciao, Slown.



Slown

19 réponses

rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
4 janv. 2006 à 20:44
Bah le mot en lui meme veuty dire douille .. en anglais ..

et alors a quoi ca sert et bah a "discuter" avec d'autre ordi par le language de programmetion...

le code suivant permet de se connecter a un serveur : (la connexion n'est pas obligatoire mais .. c'est plus simple)

WSADATA WSAData;

WSAStartup(MAKEWORD(2,0), &WSAData);

permet d'initialiser le code dans les entetes ..

SOCKADDR_IN sin;//declare un variable qui contiendra tous les parametres de notre socket



HOSTENT* ServerInfos;// ca c'est si tu veux te connecter a un nom de domaine .. pour connaitre l'ip

ServerInfos = gethostbyname("smtp.laposte.net");



sin.sin_addr.s_addr = *((u_long*) ServerInfos->h_addr);// sinon tu
peux mettre sin.sin_addr.s_addr= inet_addr("192.168.0.5");

// pour se connecter a 192.168.0.5 remarque c'est une chaine ;..

sin.sin_family = AF_INET;//laisse ca ... ca permet de se connecter a d'autre ordi

sin.sin_port = htons(25);// ca c'est le port choisi .. sur le serveur ..

sock = socket(AF_INET,SOCK_STREAM,0);//cree la socket



if((connect(sock, (SOCKADDR *)&sin, sizeof(sin)))!= INVALID_SOCKET)//connect se connecte et le if verifie la connexion

//en gros savoir isi tu t'es pas pris un vent !!

maintenant un code assez simple

au fait il faut l'entete #include <winsock2.h> et inclure les librairies libws2_32.a ...

un code simple qui ..; se connecte !!

int stop=1;

WSADATA WSAData;

WSAStartup(MAKEWORD(2,0), &WSAData);

SOCKET sock;

SOCKADDR_IN sin;

sock = socket(AF_INET, SOCK_STREAM, 0);

sin.sin_addr.s_addr = inet_addr(argv);

sin.sin_family = AF_INET;

sin.sin_port = htons(240);// j'ai choisi le port 240

while(stop){

if((connect(sock, (SOCKADDR *)&sin, sizeof(sin)))!= INVALID_SOCKET)stop=0;

}

//à ce niveau la on est connecté !!

maintenant faire un hello world version socket !!

et bah pour envoyer :

char hello[]="un petit hello world !!";

send(sock, hello,strlen(hello), 0);//donc premier arg : la socket
utilisée , le 2eme ta variable (une chaine), 3 la longueur de celle ci
//et 4 bah laisse a 0... donc tu ajoute ces deux code et la tu envoie
un petit world a celui qui se connecte !!

maintenant recuperer le hello world :

pour cela il faut creer une socket mais serveur

WSADATA WSAData;//les memes ..

int stop=1;

WSAStartup(MAKEWORD(2,0), &WSAData);

SOCKET sock;

SOCKET csock;//atention j'en ai fait 2 !!

SOCKADDR_IN sin;

SOCKADDR_IN csin;// tjr 2

sock = socket(AF_INET, SOCK_STREAM, 0);

sin.sin_addr.s_addr = INADDR_ANY;

sin.sin_family = AF_INET;

sin.sin_port
= htons(240);// bon on se met sur le bon port (on
avait pris 240 )

bind(sock, (SOCKADDR *)&sin, sizeof(sin));

listen(sock, 0);

while(stop)

{

int sinsize = sizeof(csin);

if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)

{stop = 0;

}

}

//et la t'es connecté !! bon pour pas que ca t'embete je poste les deux code juste apres ...

rrk275
0
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
4 janv. 2006 à 20:51
le client :

#include <cstdlib>

#include

#include <winsock2.h>

using namespace std;



int main(int argc, char *argv[])

{

int stop=1;

WSADATA WSAData;

WSAStartup(MAKEWORD(2,0), &WSAData);

SOCKET sock;

SOCKADDR_IN sin;

sock = socket(AF_INET, SOCK_STREAM, 0);

sin.sin_addr.s_addr = inet_addr("192.168.0.5");

sin.sin_family = AF_INET;

sin.sin_port
= htons(240);// j'ai choisi le port 240

while(stop){

if((connect(sock, (SOCKADDR *)&sin, sizeof(sin)))!= INVALID_SOCKET)stop=0;

}

char hello[]="un petit hello world !!\n";

send(sock, hello,strlen(hello), 0);//donc premier arg : la socket
utilisée , le 2eme ta variable (une chaine), 3 la longueur de celle ci

//et 4 bah laisse a 0... donc tu ajoute ces deux code et la tu envoie un petit world a celui qui se connecte !!

system("PAUSE");

return EXIT_SUCCESS;

}

rrk275
0
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
4 janv. 2006 à 20:52
le serveur :

#include <cstdlib>

#include

#include <winsock2.h>

using namespace std;



int main(int argc, char *argv[])

{

WSADATA WSAData;//les memes ..

int stop=1;

char buffer[50];

for(int i=0;i<50;i++)buffer[i] = '\0';

WSAStartup(MAKEWORD(2,0), &WSAData);

SOCKET sock;

SOCKET csock;//atention j'en ai fait 2 !!

SOCKADDR_IN sin;

SOCKADDR_IN csin;// tjr 2

sock = socket(AF_INET, SOCK_STREAM, 0);

sin.sin_addr.s_addr = INADDR_ANY;

sin.sin_family = AF_INET;

sin.sin_port
= htons(240);// bon on se met sur le bon port (on avait pris 240 )

bind(sock, (SOCKADDR *)&sin, sizeof(sin));

listen(sock, 0);

while(stop)

{

int sinsize = sizeof(csin);

if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)

{stop = 0;

}

}

recv(csock, buffer, 50, 0);

printf("%s",buffer);

system("PAUSE");

return EXIT_SUCCESS;

}


rrk275
0
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
4 janv. 2006 à 20:52
bon bah j'espere que la t'aura tout ce qui te faut pour debuter le sockets ..

(tres vite tu auras besoin des threads ...)..

rrk275
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
4 janv. 2006 à 21:37
Salut,

rrk275> tu crois vraiment que paster des gros bouts de code brut
(sans explication, sans traitement d'erreur...) ca va l'aider à
apprendre les sockets ? il ne va rien comprendre et ca aura plutot
tendance à le dégouter.
0
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
4 janv. 2006 à 21:40
Chacun ses gouts mais la je pense avor mis des explications ...(dans le 1er code)
les 2 autres montrant une simple utilisation...;

rrk275
0
cs_lacousine Messages postés 58 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 13 juillet 2007
4 janv. 2006 à 22:45
Exemple d'application ou tu pourrais te servir de socket.

Tu veux offrir de partager des fichiers ( .doc, .wav, .mp3 ...) avec d'autres utilisateurs. Tu te fais une grosse banque de données et tu permet le téléchargement via ton ordinateur à distance. Tu dois faire 2 programmes ... 1 est un serveur ( genre MSN ) et l'autre l'application qui se connecte à ton serveur ( le client que tu utilises pour parler sur MSN ). Ou une autre exemple que MSN... MIRC... on se connecte à toi ( le serveur MIRC ) et tout les clients se connecte et discute entre eux. Et oui tu peux faire un chat avec des sockets.

Moi j'aime bien comparer les sokets à des portes sur internet qui permettent d'avoir des informations. ... ou plutôt à des téléphones. Des gens appelent d'autre et échange entre eux. Ils peuvent échanger n'importe quel information.... texte, vocal, image et musique.

Et voilà mon explication de SOCKET.

Mieux vaut être blonde et poser des questions que de rester ignorante !!!!
0
Slown Messages postés 37 Date d'inscription lundi 14 mars 2005 Statut Membre Dernière intervention 20 mai 2009
5 janv. 2006 à 14:49
Merci a tous pour vos reponses. Je vais me lancer dans la programmation des socket, rrk275 m'a mis l'eau a la bouche. Et je pense qu'avec quelques tutz ça doit etre faisable. Merci a lacousine, qui ma eclairé et donnée des applications concretes ce qui m'a encore plus envie de m'y mettre. Merci encore, a+, Slown.



Slown
0
RemiONERA Messages postés 8 Date d'inscription mercredi 11 janvier 2006 Statut Membre Dernière intervention 5 juin 2008
11 janv. 2006 à 14:40
Salut rrk275


Je suis tombé sur ton explication des Socket qui somme toute très
claire. Cependant je dois développer une application où un serveur
reçoit des données (tableaux de BYTE) de 7 clients au max et je dois
avouer qu'entre les CSocket, les CAsyncSock et les SOKET je me suis pas
mal perdu. Ma question est tout d'abord comment gère tu la reception
des données car dans ton exemple tu envois une chaine de caractère et
puis c'est fini. mais moi j'ai 7 clients qui vont m'envoyer des info et
si la fonction recv est bloquant je risque de perdre les infos
provenant des autres. J'ai bien pensé à creer un thread par client qui
lance une boucle d'attente de reception de données. Qu'en pense tu y a
t'il d'autres solutions?


Il y a des jours ou je maudit franchement micosoft
Cordialement Rémi
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
11 janv. 2006 à 15:20
Il y a un tutorial sur les serveurs multi-threads sur http://www.developpez.com je pense(pas mal fait mais je pense qu'il y a des erreurs dedans...)
0
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
11 janv. 2006 à 15:25
Vu que recv est bloquant , il y a pas d'autre moyen... (a moin de (jamais essayé ...) connecter tout le monde sur le meme socket... mais je sais pas si on peut .... )
0
RemiONERA Messages postés 8 Date d'inscription mercredi 11 janvier 2006 Statut Membre Dernière intervention 5 juin 2008
11 janv. 2006 à 15:28
Pour le tutoriel sur www.developpez.com peux tu être plus précis car
j'ai fouillé un peu sur ce site et je n'ai pas trouvé grand chose. Pour
ce qui est du recv je suis en train d'essayé je te tiendrais au courant

Il y a des jours ou je maudit franchement micosoft
Cordialement Rémi
0
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
11 janv. 2006 à 15:31
0
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
11 janv. 2006 à 15:32
pour les sockets... (mais c'est a peu pres ce que j'ai dit ... )
0
cs_lacousine Messages postés 58 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 13 juillet 2007
11 janv. 2006 à 20:01
tu peux te créer un thread qui fait juste accepter des connexions, à cette endroit tu peux te garder une variable membre à ta classe pour compter le nombre de connexion. Un coup une connexion acceptée tu dois partir un thread pour ce nouveau client et conserver l'état du socket obtenu par le accept ( ). Tu as le choix de garder une trace de toute connexion établie dans un tableau.

exemple : (ps le code n'est pas testé... mais au moins vous avez la ligne générale.)

int m_iNbClient = 0;
bool m_bFermetureServeur = false;

void AccepterConnexion( )
{
while ( !m_bFermetureServeur )
{

// vérifie si le nombre maximum de client n'est pas atteind
// le nombre demandé est 7 et l'initialisation de la variable commence à 0 et non 1
// donc 7-1=6

if ( m_iNbClient < 6 )
{

// attendre une connexion d'un client
accept( );

/* récupérer le socket du client, afin de le passer en paramètre à un thread
Moi, je me suis créée une classe CUnThread qui prend en paramètre
le socket du client et ainsi que plusieurs autre paramètre. Pourquoi ? Dans ma classe, je gère toutes les informations recues ou envoyées par un client... et je gère sa déconnexion au serveur. De plus, vu que nous sommes dans un WHILE la valeur du socket sera perdu, lorsqu'un nouveau client se connectera.

Autre solution : mettre la valeur du socket dans un tableau, de cette façon vous allez pouvoir contrôler la déconnexion au serveur ou même de forcer la déconnexion d'un client ou de tout les clients.
*/

// incrémenter le nombre de client connecté
++m_iNbClient;
}// fin du if
}// fin du while
}

et voila une petite explication :D

Mieux vaut être blonde et poser des questions que de rester ignorante !!!!
0
RemiONERA Messages postés 8 Date d'inscription mercredi 11 janvier 2006 Statut Membre Dernière intervention 5 juin 2008
12 janv. 2006 à 08:51
Salut



Oui c'est un peut ce que j'ai fait et ça marche pas mal. Maintenant il me reste à gérer tout ce qui est déconnections.

Il y a des jours ou je maudit franchement micosoft
Cordialement Rémi
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
5 avril 2006 à 14:42
0
RemiONERA Messages postés 8 Date d'inscription mercredi 11 janvier 2006 Statut Membre Dernière intervention 5 juin 2008
5 avril 2006 à 15:49
Merci pour ces adresses je les avaient trouvées il y a peu et ça m'a bien dépanné et j'ai pu développer mon application .
Effectivement il y a un moteur de recherche sur developpez.com mais
hélas il me renvoit très souvent à des rubriques JAVA ou Pascal (Delphi). En plus je n'ai pas toujours la possibilité de faire des fouilles approfondies.

Par contre j'ai un peu fouillé partout et j'ai trouvé quelques truc
mais aucun de vraiment satisfaisant pour récupérer soit l'identité
réseau du PC ou son adresse IP. Si quelqu'un a des infos


Il y a des jours ou je maudit franchement micosoft
Cordialement Rémi
0
Biting Messages postés 1 Date d'inscription dimanche 10 octobre 2004 Statut Membre Dernière intervention 12 février 2007
12 févr. 2007 à 13:56
Il est possible de se mettre en écoute de plusieurs sockets (clients) à paritr d'un seul thread et sans être gêné par des appels bloquants grâce à la fonction "select" qui permet de se mettre en attente d'événements avec timeouts. J'y ai consacré un tutoriel complet disponible à l'adresse suivante : http://www.quantic-storm.com/qs/index.php?menu=Community&sm0=Sockets&language=FR
0
Rejoignez-nous