Mise en œuvre de la communication Ethernet par Socket windows

Transcription

Mise en œuvre de la communication Ethernet par Socket windows
Mise en œuvre de la communication Ethernet par SOCKET Windows
02/12/13
Réseau
Mise en œuvre de la communication Ethernet par
Socket windows
Sommaire
Table des matières
1PRÉSENTATION............................................................................................................................... 2
2MISE EN ŒUVRE DE LA COMMUNICATION PAR SOCKET................................................ 5
3MISE EN ŒUVRE............................................................................................................................. 6
4UTILISATION DE LA DLL SOCKET.......................................................................................... 14
5PATTERNS DE TRAITEMENT DES ERREURS POUR UNE FONCTION API WINDOWS
.............................................................................................................................................................. 15
6DÉCLARATION DES VARIABLES ET TRANSTYPAGE......................................................... 16
7SYNOPTIQUE DE MISE EN ŒUVRE ET DE TEST.................................................................. 17
8OPTION DE COMPILATION POUR L'UTILISATION DE LA LIBRAIRIE SOCKET AVEC
VISUEL STUDIO............................................................................................................................... 19
9DÉFINITION DU STANDARD DE PROGRAMMATION POUR VISUAL STUDIO .............20
Bibliographie
Annexe 2 : épreuve de conception du BTS II ; Communication réseau ; la communication clientserveur.
Préparation à la certification Microsoft Windows 2000 Server ; Microsoft Certified Professional ;
Examen 70-215 ; Microsoft Press.
Site WEB
Logiciel utilitaire réseau :
http:\\logiciels.ntfaqfr.com/Reseau.html
http://broux.developpez.com/articles/c/sockets/
http://c.developpez.com/cours/sockets-c-cpp-demystifies/
Sniffer : recherche avec le logiciel wireshark
SOCKET.odt
1/20
P. TREBOSC
Mise en œuvre de la communication Ethernet par SOCKET Windows
02/12/13
1 Présentation
La communication inter-processus par sockets permet de mettre en relation via des protocoles
des applications exécutées sur un même ordinateur ou sur 2 ordinateurs distants connectés par un
réseau local.
Adresse IP + N° port
Socket
Adresse IP + N° port
Socket active + Socket passive
Processus serveur
Réseau Ethernet
Processus client
Architecture pour communication socket entre 2 machines
Adresse IP + N° port
Processus serveur
+
Processus client
Architecture pour communication socket entre 2 processus d’une même machines
Chaque machine est connectée au réseau Ethernet grâce à l’installation d’une carte réseau.
L’installation consiste à installer physiquement la carte sur le bus de la carte mère et à installer son
driver et le protocole TCP/IP.
L’adresse au protocole internet IP est fixée soit manuellement par l’administrateur soit
directement par le serveur du service DHCP s’il est mis en œuvre.
Un socket peut être vu comme une structure de données qui associe 2 éléments :
•
Une adresse IP.
•
Un numéro de port utilisé pour la connexion.
La représentation que l’on peut en faire est celle d’une boîte aux lettres.
Cela permet notamment d’avoir plusieurs applications de communication qui s’exécutent sur une
même machine et qui sont distinguées par le numéro de port. On en reparlera dans la description
de l’instruction bind().
Ce document présente la mise en œuvre des sockets pour une communication avec un
client/serveur TCP
SOCKET.odt
2/20
P. TREBOSC
Mise en œuvre de la communication Ethernet par SOCKET Windows
02/12/13
Pile de protocole sous Windows
Couche Application 7
Windows 95
Windows 95
Couche Présentation 6
Windows 95
Windows 95
Couche Session 5
Windows 95
Windows 95
Couche Transport 4
TCP
TCP
Couche Réseau 3
IP
IP
Couche Liaison 2
Ethernet
Ethernet
Couche Physique 1
10 base 100
10 base 100
Client
Couche OSI
SOCKET
Serveur
Réseau local Ethernet
Organisation de la famille de protocoles TCP/IP sur les 4 couches sous
Windows
Application
Windows Socket
Application
NetBios
Windows Socket
TCP
NetBT
ICMP
IGMP
Technologie LAN :
Ethernet,
Token Ring,
FDDI
SOCKET.odt
UDP
IP
APPLICATION
TRANSPORT
ARP
Technologie
WAN :
Lignes série,
Relais de trames,
ATM
3/20
INTERNET
INTERFACE
RESEAU
P. TREBOSC
Mise en œuvre de la communication Ethernet par SOCKET Windows
02/12/13
Couche Internet : Les protocoles de cette couche intègrent les paquets dans les datagrammes
internet et exécutent tous les algorithmes de routage nécessaires.
Protocoles
Description
IP
Fournit une remise de paquets sans connexion à l’ensemble des autres protocoles
de la famille. Il n’y pas de garantie ni de l’arrivée ni de l’ordre de la séquence.
ARP
Fournit la mise en correspondance (mappage) d’une adresse IP et de l’adresse de
la sous couche MAC, nécessaire à l’acquisition de l’adresse de contrôle MAC
physique de la destination (adresse de la carte réseau installée dans la machine).
Le système qui détient l’adresse IP répond en envoyant son adresse physique au
demandeur. La sous couche MAC communique directement avec la carte réseau
et endosse la responsabilité de l’acheminement de données sans erreur entre 2
ordinateurs du réseau.
ICMP
Fournit une communication spéciale entre les hôtes et leur permet de partager les
informations d’état et d’erreur. Ces informations sont utilisées par les protocoles
de niveau supérieur pour corriger les erreurs de transmission. L’utilitaire Ping
utilise les paquets ICMP pour déterminer si un périphérique IP donné présent sur
le réseau est opérationnel ou non.
IGMP
Fournit une capacité de multi-diffusion pour communiquer et gérer des
informations sur l’ensemble des équipements présents au sein d’un groupe de
multidiffusion. Il informe les routeurs de multi-diffusion avoisinants de la
présence de membres d’un groupe hôte sur un réseau donné.
Couche de transport : Les protocoles de cette couche fournissent des sessions de
communication entre différents ordinateurs.
TCP
Fournit des communications fiables orientés connexion. Il garantit la fourniture
et la mise en séquence des paquets de données. On l’utilise pour la transmission
de grandes quantités de données.
UDP
Fournit des communications sans connexion et ne garantit pas la fourniture des
paquets. On l’utilise dans le cas de transmission de petite quantité de données
vers plusieurs destinataires.
Couche application : C’est par cette couche que les applications obtiennent un accès au réseau.
Elle intègre un grand nombre d’utilitaires et de service TCP/IP standard : FTP, Telnet, SNMP,
DNS etc.
Winsock
NetBT
SOCKET.odt
Agit comme l’interface standard entre les applications reposant sur des sockets et
des protocoles TCP/IP
Agit comme l’interface standard pour les services NetBIOS, notamment ceux
destinés aux noms, aux datagrammes et aux sessions. Il fournit également une
interface standard entre des applications NetBIOS et des protocoles TCP/IP
4/20
P. TREBOSC
Mise en œuvre de la communication Ethernet par SOCKET Windows
02/12/13
2 Mise en œuvre de la communication par SOCKET
Définitions
L’hôte est la machine qui applique le processus ou l’application qui utilise la communication par
socket.
Les phases sont les suivantes :
•
Création de la SOCKET avec les bonnes options : primitive socket().
•
Préparation de la communication : bind(), listen(), accept(), connect(),
•
Communication primitive : : write(), read()
•
Fermeture primitive : close().
Le schéma ci-dessous présente le principe de communication orientée connexion TCP entre un
serveur et un client. Comme on peut le constater, ce processus est synchronisé.
Serveur
Création
Client
Création
Socket()
Socket
Socket Passive
Socket()
Attachement
ou d'écoute
IP + N° port
Bind()
Listen()
Attente Passive
d'une connexion
Accept()
Processus bloqué
Connexion établie
Création
Socket Active
Attente Passive
Send()
Recv()
Le traitement de
l'application
utilisant le
message
d'une communication
Attente Passive
d'une communication
Connect()
Recv()
Traite()
Send()
Traite()
Close()
Close()
schéma de principe de communication SOCKET
SOCKET.odt
5/20
P. TREBOSC
Mise en œuvre de la communication Ethernet par SOCKET Windows
02/12/13
3 Mise en œuvre
Il existe au moins 3 méthodes pour implémenter la communication socket :
•
Primitives Berkeley, accessibles avec les API Windows socket est compatible ou
d’implémentation a peu près identique quel que soit le système d’exploitation.
•
Primitives API Windows évoluées WSA, les instructions apportent des extensions
par rapport aux fonction Berkeley.
•
Composants disponibles si on utilise un environnement de développement graphique.
L'utilisation de ces contrôles nécessite néanmoins une connaissance approfondie des
mécanismes mis en jeu.
Les 2 premières solutions sont mises en œuvre en utilisant le synoptique de principe du
paragraphe précédent.
Architecture WinSock
Le système d’exploitation Windows contient la DLL qui permet la mise en œuvre de la
communication par Socket. Elle établit le lien entre les couches basses de l’OS et l’application. La
version WinSock2 à succédée à la première version WinSock 1.1 L’architecture peut être
représentée par la figure ci-dessous.
Il incombe au développeur de s’assurer de la correspondance des primitives utilisées avec la
version de DLL chargée dans le système d’exploitation Windows.
Application
Application
Application
Application
WinSock
2
WinSock
WinSock 2
WinSock1.1
1.1
WINSOCK.DLL
WINSOCK.DLL(16
(16bits)
bits)
WSOCK32.DLL
WSOCK32.DLL(32
(32bits)
bits)
WS2_32.DLL
WS2_32.DLL(32
(32bits)
bits)(WinSock2
(WinSock2DLL)
DLL)
TCP/IP
TCP/IP- -based
based
Namespace
Namespace
Service
Serviceprovider
provider
e.g
e.gDNS
DNS
TCP/IP
TCP/IP
Transport
Transport
Service
Serviceprovider
provider
Rappel : On parle de mode bloquant pour une instruction qui stoppe le déroulement d’un
processus tant qu’elle n’est pas exécutée. Dans ce cas l’application est bloquée si l’on a pas pris la
précaution de la fabriquer en mode muliti-thread.
SOCKET.odt
6/20
P. TREBOSC
Mise en œuvre de la communication Ethernet par SOCKET Windows
02/12/13
Je décris brièvement ci-dessous les instructions au standard Berkeley. On remarque l'instruction
ioctlsocket qui est indispensable pour travailler en mode bloquant sous Windows.
Structures d'adresse
Structure d’adresse générique (valable dans tous les cas de domaine)
struct sockaddr
{
u_short
sa_family;
/*famille d’adresse*/
char
sa_data[14];
/* 14 octets d’adresse*/
};
Evidemment, cette structure doit être renseignée avant l’exécution de bind().
namelen : [in] Longueur de la structure d’adresse sockaddr.
Dans le domaine AF_INET, la structure de famille d’adresse de style internet spécifique à
utiliser est :
struct sockaddr_in {
short sin_family;
/*AF_INET*/
char sin_port;
/*port choisi, sur 2 octets*/
struct in_addr sin_addr;
/*adresse internet, sur 4 octets*/
char sin_zero[8];
/*caractères de remplissage 8 zéros*/
};
Cette adresse devra être renseignée puis transtypée pour être utilisée dans les paramètres des
fonctions. Voir le paragraphe
En cas d’adresse IP invalide, ou de demande d’attachement à un port déjà occupé, bind()
échoue et retourne –1. Il faut donc faire attention au choix du port dans le domaine non réservé.
Le symbole INADDR_ANY, placé dans le champ sin_addr, désigne les adresses internets de
l’hôte.
struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
Si on veut accepter les sockets sur une seule adresse par exemple :
sin.sin_addr.s_addr = inet_addr("200.0.0.1");
On remarque le transtypage d'une chaîne de caractères en adresse de type INET.
Ces structures peuvent être visualisées dans l'environnement de développement. On accède à la
déclaration d'une structure en cliquant droit sur la ligne de déclaration et chercher la déclaration.
SOCKET.odt
7/20
P. TREBOSC
Mise en œuvre de la communication Ethernet par SOCKET Windows
02/12/13
En résumé
Dans les aides des API socket présentées ci-dessous, on retrouve en paramètre la structure
générique sockaddr. Si on travaille dans le domaine AFINET, il faudra utiliser et renseigner la
structure sockaddr_in qui sera transtypée en sockaddr pour être utilisée en paramètre dans
les API.
Pour le client qui va se connecter au serveur, il faut renseigner le l'adresse IP du serveur et le port
de communication.
Pour le serveur qui attend les demande de connexion , il n'est pas nécessaire de renseigner
l'adresse IP.
Primitives application serveur
Bind()
Associe (ou lie) une adresse locale à un Socket..
Une fois que le point de communication Socket est créé, on lui associe les éléments ci-dessous
qui renseigne l’application :
•
une adresse locale IP qui identifie la machine hôte de l'application
•
un numéro de port qui distingue le processus exécuté dans la machine qui désire
communiquer par ce point (il peut y avoir plusieurs processus exécuté simultanément sur
une même machine qui communique par le même carte réseau donc avec la même
adresse IP).
Ce doublet s'appelle adresse d'attachement du point de communication.
int bind (SOCKET s, const struct sockaddr FAR*
name, int namelen
);
ou
int bind(sock, (SOCKADDR*)&sin, sizeof(sin));
Rappel : Il faut transtyper le passage d'adresse de la donnée (LPSOCKADDR)
Paramètres
S : [in] Descripteur du socket retourné par socket()
Name : [in] Adresse d’attachement, de type variable suivant la famille d’adressage (le domaine)
SOCKET.odt
8/20
P. TREBOSC
Mise en œuvre de la communication Ethernet par SOCKET Windows
02/12/13
Listen()
Met en écoute un socket vers une connexion
La primitive listen() joue 2 rôles :
•
Déclaration aux couches inférieures du protocole que la socket dont le descripteur est
passé en argument est dite passive ou d'écoute (c’est à dire qu’elle sert uniquement à
écouter les demandes de connexion), et qu’elle est prête à accepter des requêtes de
connexion.
•
Demande au système de réserver une file d’attente pour mémoriser les demandes de
connexion simultanées.
int listen (SOCKET s, int backlog);
Paramètres
S : [in] Descripteur du socket.
Backlog : [in] Taille de la file d’attente, c’est à dire le nombre de requêtes simultanées que le
système accepte de suspendre en attente de traitement. Si la valeur est SOMAXCONN, le service
fixe la taille à la valeur maximum "raisonnable".
Instruction appliquée pour les serveurs orientés connexion TCP.
Accept()
Accepte une connexion sur un socket .
La primitive réalise successivement les 2 opérations suivantes :
•
Elle attend l’établissement d’une connexion sur la socket d’écoute pendant un laps de
temps déterminé.
•
Un fois la connexion établit (par le client), l’instruction extrait la première connexion de
la queue de la connexion associée à S (de listen()), puis crée un nouveau socket,
active, avec son handle qui servira ultérieurement à la communication entre le client et le
serveur.
Si le mode de communication est bloquant, la primitive accept() bloque l'application jusqu'à
ce qu'une connexion arrive. La configuration du mode de communication se fait avec la fonction
ioctlsocket().
SOCKET accept (SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen);
Paramètres
S : [in] Descripteur du socket passive qui est à l’écoute après le listen().
Addr : [out] Récupération de l’adresse complète (IP et n° de port) du client au retour de l’appel.
Le format est identique à celui qui a été déclaré. Pour le domaine INET, sockaddr et en
fait
sockaddr_in.
Addrlen : [out] Pointeur sur un entier qui contient la longueur de la structure d’adresse sockaddr.
En INET sockaddr_in.
SOCKET : Entier
retourné par la primitive qui est le descripteur de la socket active qui vient
d’être créée pour communiquer.
SOCKET.odt
9/20
P. TREBOSC
Mise en œuvre de la communication Ethernet par SOCKET Windows
02/12/13
Lorque la primitive accept() est traitée nous disposons d’une nouvelle socket (active) dont
l’attachement est fait et qui est en relation avec le processus client. On connaît l’adresse du
processus client (IP + N° de port).
Il faut donc pour le serveur céer 2 sockets : sock avec sin et csock avec csin.
Instruction appliquée pour les serveurs orienté connexion TCP.
Primitives application client
Connect()
Etablit une connexion vers une destination spécifiée: l'application serveur en état accept.
Le connect() complète les informations des processus client (renseigné automatiquement) et
serveur.
En mode bloquant, l'application client attend que l'application serveur ai ouvert une connection
avec accept.
La configuration du mode de communication bloquant ou non bloquant se fait avec l'instruction
ioctlsocket.
int connect (SOCKET s, const struct sockaddr FAR*
name, int namelen);
Paramètres
S : [in] Descripteur du socket. locale
Name : [in] Adresse d’attachement du point de communication distant (serveur) avec lequel on
veut rentrer en contact.
On utilise :
récupération de l’adresse d’une machine pour remplir le champ
sin_addr de la structure, et pour mettre en relation avec un service standard. Si une
machine est une passerelle, elle peut avoir plusieurs adresse IP pour chaque carte
réseau installée.
•
gethostbyname()
•
Getservbyname()
pour connaître le numéro de port du serveur.
Namelen : [in] Longueur de l’adresse.
SOCKET.odt
10/20
P. TREBOSC
Mise en œuvre de la communication Ethernet par SOCKET Windows
02/12/13
Primitives communes application serveur et client
Socket()
Création d’un point de communication.
SOCKET socket (int domain, int type, int protocole);
L’entier retourné correspond au descripteur du socket créé.
Domaine ou famille d’adressage
•
AF_UNIX : machine locale
•
AF_INET : internet (famille d’adresse utilisée par les protocoles de la famille TCP/IP
Type de socket
•
SOCK_STREAM : full-duplex, fiable, avec connexion, préservation de l’ordre des
données, non duplication des données, données hors bande (urgentes).
•
SOCK_DGRAM : non-fiable, sans connexion, préservation des limites de messages.
•
SOCK_RAW : bas niveau, pour développer de nouveau protocoles
Protocole : Il peut être mis à zéro par défaut car il est généralement fixé par le choix du domaine et
du type de socket.
AF_INET + SOCK_DGRAM  UDP
AF_INET + SOCK_ STREAM  TCP
Si on utilise une famille d’adressage qui propose plusieurs protocoles pour un type de service
identique, il faut déterminer le protocole : IPPROTO_UDP, IPPROTO_TCP,
IPPROTO_ICMP et IPPROTO_RAW.
SOCKET.odt
11/20
P. TREBOSC
Mise en œuvre de la communication Ethernet par SOCKET Windows
02/12/13
Ioctlsocket()
Contrôle le mode de fonctionnement bloquant ou non bloquant des sockets.
SOCKET ioctlsocket (SOCKET s, long cmd, u_long FAR* argp);
Paramètres
S : [in] Descripteur du socket.
Cmd : [in] Commande pour mettre en œuvre le socket s
Les commandes peuvent être FIONBIO, FIONREAD ou SIOCATMARK.
Pour configurer le mode bloquant on utilise la commande FIONBIO.
Argp : [in/out] Pointeur vers cmd.
//Exemple pour
//
//
FIONBIO : Paramétrage du mode bloquant ou non bloquant.
Si p = 0 mode bloquant
Si p <> 0 mode non bloquant
Exemple :
unsigned long int p = 0;
ioctlsocket (s, FIONBIO, &p);
s est le descripteur de socket retourné à la création.
Cette fonction est à appliquer avant les instructions bloquantes, sur l’application serveur avant la
fonction accept(…) et elle est valable pour la fonction recv(…). Pour le client, il faut l’appliquer
avant la fonction recv(…).
Recv()
Reçoit des données sur un socket.
Si le socket est configuré en mode bloquant, l'instruction est bloquante et attend qu'un message
arrive (send()) en provenance de l'application distante connectée.
int recv (SOCKET s, char FAR* buf, int len, int flags
);
Paramètres
S : [in] Descripteur de la socket..
Buf : [out] Buffer pour les données entrantes.
Len : [in] Taille du buffer.
Flags : [in] Spécifie le chemin dans lequel l’appel est fait. Flags est généralement à 0.
Int : indique le nombre d'octets lus.
SOCKET.odt
12/20
P. TREBOSC
Mise en œuvre de la communication Ethernet par SOCKET Windows
02/12/13
Send()
Envoie une donnée sur une socket connectée.
Si la socket est configurée en mode bloquant, l'instruction est bloquante et attend que le message
soit arrivée (recv()) sur l'application distante connectée.
int send (SOCKET s, const char FAR * buf, int len, int flags);
Paramètres
S : [in] Descripteur de la socket..
Buf : [in] Buffer pour les données à transmettre.
Len : [in] Taille du buffer.
Flags : [in] Spécifie le chemin dans lequel l’appel est fait. Flags est généralement à 0.
Int : indique le nombre d'octets lus ou une erreur si problème lors de d'envoi.
Close()
Fermeture d'une socket.
int closesocket (SOCKET s);
Paramètres
S : [in] Descripteur du socket.
Attention : pour l’application serveur, il faut fermer 2 sockets.
SOCKET.odt
13/20
P. TREBOSC
Mise en œuvre de la communication Ethernet par SOCKET Windows
02/12/13
4 Utilisation de la DLL Socket
Faire un include de la dll winsock choisis.
Avant d'utiliser les instructions API Windows Socket, il faut vérifier la version installée puis
démarrer la DLL.
Lorsque la communication est terminée, il faut fermer la DLL.
Il faut inclure au projet les fichiers de déclaration nécessaires. Pour les connaître on peut se
reporter à l'aide de l'environnement de développement.
Vérification de la version DLL
//Initialisation de l'utilisation de la DLL windows pour les Sockets
//détermine la version supportée par le système d'exploitation.
//Cela permet à une DLL socket windows et à l'application développée d'être
//compatible. On compare les résultats contenus dans wsaData (wVersion et
//wHighVersion et on vérifie la compatibilité avec wVersionRequested
//Déclaration des données pour WSAStartup
WORD wVersionRequested;
WSADATA wsaData;
// Fixe la version de la DLL socket pour l'application à 2;
wVersionRequested = MAKEWORD(1,0);// ou wVersionRequested=MAKEWORD( 2, 0 );
Démarrage de la DLL avec traitement des erreurs
// Traitement des erreurs pour API Windows
err = WSAStartup( wVersionRequested, &wsaData );
if (err != 0 )
{//Traitement de l'erreur
switch (err)
{
case WSASYSNOTREADY : strcpy(MesErr,\
"Le réseau n'est pas prêt pour la communication.");
break;
case WSAVERNOTSUPPORTED : strcpy(MesErr,"Version non \
compatible.");
break;
case WSAEINPROGRESS : strcpy(MesErr,"Socket windows \
bloquante de version 1.1 en cours.");
break;
case WSAEPROCLIM : strcpy(MesErr,"Limitation des tâches \
supportée par windows.");break;
case WSAEFAULT : strcpy(MesErr,"IpWSAData n'est pas un \
pointeur valide.");break;
}
//Signalisation de l'erreur
//Si composition bidirectionnelle avec l'IHM – A EVITER EN OBJET DE METIER
if ( Application->MessageBox(MesErr,"Serveur : Erreur WSAStartup \
init et compatibilté DLL socket", MB_OK) != IDOK)
Application->Terminated;
//Plutôt passer le message en paramètre si erreur ou « OK » si pas d'erreur
}
// fin si
Fermeture de la DLL
//Fin d'utilisation de la DLL
WSACleanup()
SOCKET.odt
14/20
P. TREBOSC
Mise en œuvre de la communication Ethernet par SOCKET Windows
02/12/13
5 Patterns de traitement des erreurs pour une fonction API
Windows
Les instructions décrites retournent généralement un argument qui peut indiquer une erreur. Pour
obtenir une application fiable, il faut traiter les erreurs en signalant un message à l'écran. Le
schéma est le suivant :
1. Instruction par exemple ioctlsocket()
2. Traitement du code erreur associé à ioctlsocket()
Le code ci-dessous donne la méthode pour traiter les erreurs. Ce code doit être compris puis
réutilisé.
unsigned long int p = 0;
if (ioctlsocket(SockPassive,FIONBIO,&p) != 0)
{
//Récupération de la dernière erreur
erreur = WSAGetLastError();
//Traitement de l'erreur
switch (erreur)
{
case WSANOTINITIALISED : strcpy(MesErr,\
"A successful WSAStartup must occur before using this function.");
break;
case WSAENETDOWN : strcpy(MesErr,\
"The network subsystem has failed.");break;
case WSAEINPROGRESS : strcpy(MesErr,\
"A blocking Windows Sockets 1.1 call is in progress, or the \
service provider is still processing a callback function.");
break;
case WSAENOTSOCK : strcpy(MesErr,\
"The descriptor s is not a socket.");
break;
case WSAEFAULT : strcpy(MesErr,\
"The argp argument is not a valid part of the user address
space.");
break;
}
//Dans un environnement Graphique
if ( Application->MessageBox(MesErr, \
"Client : Erreur API ioctlsocket", MB_OK) != IDOK)
{ // reset de l'erreur
WSASetLastError(0);
return -1;
}
}
Les cas d'erreur possibles pour une fonction se trouvent dans l'aide en ligne.
Ici on affiche le message d'erreur dans la méthode. Ce n'est pas portable, il vaut mieux que la
méthode retourne le message d'erreur pour respecter la séparation IHM objet de métier.
SOCKET.odt
15/20
P. TREBOSC
Mise en œuvre de la communication Ethernet par SOCKET Windows
02/12/13
6 Déclaration des variables et transtypage
Déclaration des types utilisés
Un certain nombre de variables de type complexe doivent être déclarées : socket, adresse…
// création d'un numéro de descripteur de socket
//la fonction socket retourne un type SOCKET
SOCKET SockPassive;
SOCKET SockActive;
//déclaration de la structure addresse type inetrnet d’un socket.
// Les deux types de déclarations sont équivalents
SOCKADDR_IN sin;
struct sockaddr_in pin;
u_short port;
// numéro de port affecté à la Socket
const char FAR *AdIPDist;
// adresse IP de la machine distante à
//contacter
Utilisation des sockets dans les primitives
if(connect(Sock,(LPSOCKADDR) & SockPassive, sizeof(struct sockaddr_in)) ==
-1)
Ou
if(connect(sock,(struct sockaddr*) & SockPassive, sizeof(struct
sockaddr_in)) == -1)
Pour accept int FAR* addrlen s'écrit par exemple : int taille =
sizeof(struct sockaddr_in);
Macros de conversion des entiers en port
Le problème se pose avec la représentation des entiers : numéro de port et adresse IP de la
structure d’adresse sockaddr_in.
Cette représentation varie suivant les plates-formes de travail :
•
Big-endian : poids fort puis poids faible
•
Little-endian : poids faible puis poids fort
Les protocoles de la famille TCP/IP travaillent sur des entiers de type Big-endian. On utilise les
macros ci-dessous de conversion pour représenter les entiers de numéro de port et d’adresse IP.
: entier long, représentation hôte  représentation réseau (Host to Network long)
Htons(x) : entier court, représentation hôte  représentation réseau (Host to Network short)
Htohl(x) : entier long, représentation réseau  représentation hôte (Host to Host long)
Htohs(x) : entier court, représentation réseau  représentation hôte(Host to Host short)
Htonl(x)
SOCKET.odt
16/20
P. TREBOSC
Mise en œuvre de la communication Ethernet par SOCKET Windows
02/12/13
Exemple :
//Déclaration d’un port de communication avec la fonction de transtypage htons()
Int port ;
Htons(port) ;
Transtypage
Transtypage d'adresses IP
inet_addr("200.0.0.1")
Transtypage des tructures d'adresse socket
Voici les différentes façons de transtyper une structure sockaddr_in en sockaddr pour
utilisation dans les API socket :
(SOCKADDR*) &SockPassiveAddr
ou
(LPSOCKADDR) &SockPassiveAddr
ou
(struct sockaddr*) &SockPassiveAddr
7 Synoptique de mise en œuvre et de test
Etape 1
Créer un projet sous Builder qui contient une feuille TFIHM pour l'interface graphique Homme
Machine.
Ajouter une unité ClsUtilSocket (c'est à dire un .cpp et un .h) et ClsServeurSocket ou
ClsClientSocket (suivant l'application développée) pour contenir les classes de métier de travail
avec les Sockets.
SOCKET.odt
17/20
P. TREBOSC
Mise en œuvre de la communication Ethernet par SOCKET Windows
02/12/13
Etape 2
Créer la composition bidirectionnelle entre le formulaire de l'interface graphique et l'objet de
métier : la classe serveur ou client.
Créer l'héritage entre les classes
ClsClientSocket
ClsUtilSocket et les classes
ClsServeurSocket ou
ClsUtilSocket
Tout ce qui est
commun
aux deux applications
client et serveur
TFIHM
ClsServeurSocket
L'interface
graphique
Homme-machine
Ce qui est spécifique
au serveur socket
On peut faire une seule classe qui fait client et serveur et qui se configure suivant l'application.
Etape 3 : développement
Serveur
Vérifier la version de la DLL Windows
Client
Démarrage socket
Déclaration d'une socket passive d'attente de connexion pour le serveur et socket de
communication pour le client
Application du principe de communication SOCKET
voir synoptique
SOCKET.odt
18/20
P. TREBOSC
Mise en œuvre de la communication Ethernet par SOCKET Windows
02/12/13
Remarque
Il est possible de créer une classe fermer() différente dans la classe serveur de la classe fermer() de
la classe clsUtilSocket. On utilise le polymorphisme de méthode.
Dans fermer() de la classe clsServeur, on ferme deux sockets, la socket passive et la socket active.
Dans fermer() de la classe clsUtilSocket, on ferme une socket, ce qui est le cas pour le cas d'un
client.
8 Option de compilation pour l'utilisation de la librairie socket
avec Visuel studio
#pragma warning(disable : 4996)
#include <winsock.h>
//Option de compilation
#pragma comment(lib, "wsock32.lib")
//ou
//#include <winsock2.h>
//#pragma comment(lib, "ws2_32.lib")
Ne pas oublier de modifier la propriété du projet : Prise en charge du Common Langage
Runtime ) /clr
Pour obtenir une aide en ligne spécifique au API socket tapez par exemple dans index :
pour VS 2008 : connect function [Winsock]
pour VS 2010 : connect Function (Windows)
Transformation d'une String en char*
StringToHGlobalAnsi copie les contenus d'un objet managé String dans le segment natif et puis
le convertit, au format ANSI à la volée (American National Standards Institute) . Cette méthode
alloue de la mémoire de tas natif requis :
//using namespace System::Runtime::InteropServices;
System::String ^ str = "Hello world";
char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
printf(str2);
//Libère la mémoire précédemment allouée de la mémoire non managée
Marshal::FreeHGlobal(safe_cast<IntPtr>(str2));
SOCKET.odt
19/20
P. TREBOSC
Mise en œuvre de la communication Ethernet par SOCKET Windows
02/12/13
9 Définition du standard de programmation pour Visual studio
La ligne de définition de l'option de précompilation ci-dessous est défini graphiquement*.
#pragma comment(lib, "wsock32.lib")
Rajouter la dépendance wsock32.lib
dans modifier rajouter wsock32.lib
SOCKET.odt
20/20
P. TREBOSC

Documents pareils

reseaux - Retour à la page d`accueil

reseaux - Retour à la page d`accueil Le modèle OSI a été mis à côté pour faciliter la comparaison entre les deux modèles. 2.2 - La couche hôte réseau Cette couche est assez "étrange". En effet, elle semble "regrouper" les couches phy...

Plus en détail