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