Cours 2 : La création d'une socket
1 L'interface socket
Comme le montre la figure 1 ci-dessous, l'interface socket correspond à deux choses :
- L'interface correspond tout d'abord à une interface de programmation, c'est-à-dire à un ensemble de primitives permettant
de programmer au dessus des couches transport TCP et UDP.
- Par ailleurs la socket correspond également à un point de communication sur la pile de protocole TCP/IP c'est-à-dire qu'elle
représente l'adresse d'une application donc un couple
adresse IP
- numéro de port.
De plus, l'interface des sockets est compatible avec l'interface des fichiers Unix. Lors de la création d'une socket, un descripteur
de socket est alloué dans la table des fichiers ouverts du
processus
créateur. Ce descripteur pointe sur une structure de socket plutôt que de pointer sur une structure de fichiers (inode). Notamment
la socket répond aux critères d'héritage père fils qui s'applique aux descripteurs de fichiers.
 |
Fig 1 : l'interface socket
|
|
2 La création d'une socket
La création d'une socket s'effectue par un appel à la
primitive SOCKET
dont le prototype est donné ci-dessous. Le premier paramètre domaine prend la valeur AF_INET. Le second paramètre qui correspond
au type de service prend pour valeur soit SOCK_STREAM pour une communication en mode connecté, soit SOCK_DGRAM pour une communication
en mode datagramme. Le troisième paramètre protocole correspond au protocole utilisé, donc soit TCP, soit UDP. Le champ peut
être mis à zéro ce qui laisse alors le système choisir le bon protocole en fonction du type spécifié.
int socket (domaine, type, protocole)
int domaine ;
int type ;
int protocole ;
La primitive de création socket retourne un entier correspond au descripteur de la socket créée. À l'issue de l'opération
de création, la socket tout comme un fichier est utilisable par le processus créateur et les processus créés par ce processus
créateur après la création de la socket.
Définition : Primitive Socket
int socket (int domaine, int type, int protocole) : création d'une socket de communication
3 L'attâchement d'une adresse à une socket
Pour que des processus extérieurs à la famille du processus créateur puissent accéder à la socket il faut maintenant attâcher
une adresse à cette socket. La primitive permettant d'attâcher une adresse à une socket est la
primitive BIND
. Le prototype de la primitive BIND est donné ci-dessous. Le premier paramètre correspond au descripteur de socket créé par
l'appel socket. Le second paramètre correspond à une structure de type sockaddr_in. Cette structure permet de stocker une
adresse d'application c'est-à-dire notamment une adresse IP et un numéro de
port
. Le dernier paramètre lg correspond la taille de la structure d'adresse en octets.
int bind (sock, p_adresse, lg)
int sock;
struct sockaddr_in *p_adresse;
int lg;
struct sockaddr_in {
short sin_family; -- AF_INET
ushort sin_port; -- le numéro de port
struct in_adrr sin_addr ; -- l'adresse IP
char sin_zero[8]; -- huit 0
}
Définition : Primitive Bind
int bind (int sock, sockaddr_in *p_adresse, int lg) : attâchement de l'adresse p_adresse à la socket sock
4 Un exemple : la fonction creesock
int creesock(port, type)
int port; /* le numero de port au format local */
int type ; /* le type de la socket : SOCK_DGRAM ou SOCK_STREAM
{
int sock;
struct sock_addr_in nom;
int longueur;
/* Création de la socket */
if((sock = socket(AF_INET,type,0)) < 0)
{
perror("socket");
exit(1);
}
/* preparation de l'adresse */
/* la zone mémoire pour l'adresse est mise à 0 */
bzero(&nom,sizeof(nom));
nom.sin_family = AF_INET;
nom.sin_port = htons(port) ; /* passage au format réseau */
nom.sin_addr.s_addr = INADDR_ANY ; /* n'importe quelle
adresse IP
de la machine locale */
/attâchement de la socket */
if(bind(sock, &nom, sizeof(nom)) < 0)
{
perror("bind");
exit(2);
}
return(sock) ;
Programmation socket
La création d'une socket
|