Introduction à la Programmation Sockets

Gazette Linux n°47 — novembre 1999

par Pedro Paulo Ferreira Bueno et Antonio Pires de Castro Junior (Copyright © 1999)

traduction par Rachid Oubraim (tous droits réservés) oubchid CHEZ gmail POINT com

relecture exemple email CHEZ exemple POINT com


Introduction

La plupart des systèmes d'exploitation offrent des programmes précompilés qui communiquent à travers un réseau, Parmi les exemples courants dans le monde TCP / IP sont les clients web (navigateurs) et les serveurs Web et les clients et les serveurs FTP et TELNET. Parfois, lorsque nous utilisons ces utilités d'Internet, nous ne pensons pas à tout le processus en cause. Pour mieux comprendre cette aspects que nous, dans notre groupe de recherche (GTI, Grupo de Tecnologia em Informática) à l'Université catholique de Goias (Universidade Católica de Goiás), décidons de construire, écrire nos propres programmes de réseau, mini-chat, en utilisant la structure de base sur les sockets, une interface de programme d'application ou une API, ce mécanisme qui rend toute cette communication possible sur le Net.

Nous examinons les fonctions de communication via les sockets, Une socket est un point de terminaison utilisée par processus de communication bi-directionnelle avec une socket associée à un autre processus. Les sockets, présentées dans l'Unix de Berkeley, sont un mécanisme de base pour IPC sur un système informatique, ou sur des systèmes informatiques différents connectés par des réseaux locaux ou étendus (ressource 2). Pour comprendre certains struct dans ce sujet est nécessaire, une connaissance plus approfondie sur le système d'exploitation et ses protocoles réseau. Ce sujet peut être utilisé soit comme débutants programmeurs ou comme une référence pour les programmeurs expérimentés.

La fonction du socket

La plupart des applications de réseau peuvent être divisés en deux parties: un client et un serveur.

Création d'une socket

#include <sys/types.h>
#include <sys/socket.h>

Lorsque vous créez une socket il ya trois paramètres principaux que vous devez spécifier:

int socket(int domaine, int type, int protocole);

Le paramètre domaine spécifie un domaine de communications dans lequel la connexion aura lieu, dans notre exemple le paramètre de domaine était AS_INET, qui spécifient les protocoles Internet ARPA le paramètre type spécifie la sémantique de la communication, dans notre mini-discussion, nous avons utilisé le type socket stream (SOCK_STREAM ), car il offre une connexion en fonction du flux d'octets à deux voies bi-directionnelle, fiable (ressources 2). Enfin, le type de protocole, car nous avons utilisé un type courant Socket nous devons utiliser un protocole qui prévoit un protocole orienté connexion, comme IP, si nous décidons d'utiliser la propriété intellectuelle dans notre type de protocole, et nous avons vu dans /etc/protocols le nombre de . ip, 0 Donc, notre fonction est la suivante:

 s = socket(AF_INET , SOCK_STREAM , 0) 
où s est le descripteur de fichier renvoyé par la fonction socket.

Puisque notre mini chat est divisé en deux parties nous allons a divisé l'explication dans le serveur, le client et le tous les deux, montrant les différences de base entre eux, comme nous verrons par la suite.

La structure du serveur Mini-chat

Attacher une socket à un port et attendre les connexions

Comme tous les services dans un réseau basé sur TCP / IP , les sockets sont toujours associé à un port, comme Telnet est associé au port 23, FTP à 21 ... Dans notre serveur, nous devons faire la même chose, lier un port pour être et prêt à l'écoute des connexions (c'est la différence fondamentale entre le client et le serveur), le Listing 2. Bind est utilisé pour spécifier à une socket le numéro de port de protocole où il sera en attente de messages.

Donc, il ya une question, quel port pourrions-nous lier à notre nouveau service ? Comme le système a pré-défini un grand nombre de ports entre 1 et 7000 (/ etc / services), nous choisissons le numéro de port 15000.

la fonction bind est :

int bind(int s, struct sockaddr *addr, int addrlen)

La structure nécessaire pour réaliser des travaux de socket est la structure sockaddr_in l'adresse; et ensuite nous avons les lignes se suivant pour dire au système les informations sur la socket.

Le type de socket
address.sin_family = AF_INET / * utiliser un domaine internet * /
The IP used
address.sin_addr.s_addr = INADDR_ANY/ * utiliser une adresse IP spécifique de l'hôte * /
The port used
address.sin_port = htons(15000); /* Utiliser un numéro de port spécifique */

Et enfin lier notre port à la socket

bind(creation_socket , (struct sockaddr *)&address,sizeof(address));

Maintenant, une autre étape importante, préparer une socket pou accepter les messages des clients, la fonction listen() est utilisé sur le serveur dans le cas de communication en mode connecté et également le nombre maximal de connexions en attente (ressource 3).

listen (creation_socket, MAXNUMBER)

où MAXNUMER dans notre cas est 3. Et pour finir, nous devons dire au serveur d'accepter une connexion, en utilisant la fonction accept (). Accepte() est utilisé avec socket de connexion à base tels que stream.

accept(creation_socket,(struct sockaddr *)&address,&addrlen);

Comme nous pouvons le voir dans le Listing 2 Les paramètres sont le descripteur de la socket socket maître (create_socket), suivie par une structure de sockeaddr_in et la taille de la structure. (Ressource 3)

La structure du client Mini-chat

La plus grande différence est que le client a besoin d'une fonction Connect (). L'opération de connexion est utilisé sur le côté client pour identifier et, le cas échéant, établir la connexion vers le serveur. La syntaxe de connexion est :

connect(creation_socket,(struct sockaddr *)&address,sizeof(address)) ;

La structure commune

la structure commune entre le client et le serveur est l'utilisation de la structure struct hostent comme comme l'observation dans le Listing 1 et 2. L'utilisation de send() et recv() fonctions sont encore des codes communs.

la fonction Send () est utilisé pour envoyer le tampon sur le serveur

send(nouveau_socket,buffer,bufsize,0);   

et la fonction recv () est utilisée pour recevoir le tampon à partir du serveur, l'air qui est utilisé à la fois dans le serveur et le client.

recv(nouveau_socket,buffer,bufsize,0);

Conclusion

Puisque le logiciel du protocole TCP/IP est à l'intérieur du système d'exploitation, l'interface exactement entre une application et les protocoles TCP / IP dépend des détails du système d'exploitation (4 ressources). Dans notre cas, nous examinons UNIX BSD l'interface de la socket parce que Linux suit ceci. Le Mini-chat développé ici n'est rien de plus qu'un modèle expliquant une application client/serveur en utilisant des sockets dans Linux et devrait être utilisé comme une introduction de développer des applications en utilisant les sockets. Après avoir compris ceci vous pouvez facilement commencer de penser à l'IPC (communication interprocess), fork, les threads (ressources 5) et beaucoup plus. Les étapes de base pour le faire fonctionner est:

  1. Exécutez le serveur
  2. Exécutez le client avec l' adresse du serveur
Incroyable, n'est ce pas?

Cet exemple a été le début de notre programme de serveur dans notre dernier projet, un programme de gestion de réseau. Voici la liste des sources:

Resources

  1. Operating Systems , Harvey M. Deitel , 1990
  2. Socket Linux Man Page
  3. Network Functions in C - Tutorial
  4. Internetworking with TCP/IP Vol1 - Doulgas Commer
  5. Unix Network Programming , Vol2 , Richard Stevens
  6. Unix Network Programming, Vol1, Richard Stevens


Adaptation française de la Gazette Linux

L'adaptation française de ce document a été réalisée dans le cadre du Projet de traduction de la Gazette Linux

Cet article est publié selon les termes de la Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.

Vous pourrez lire d'autres articles traduits et en apprendre plus sur ce projet en visitant notre site http://www.traduc.org/Gazette_Linux

Si vous souhaitez apporter votre contribution, n'hésitez pas à nous rejoindre, nous serons heureux de vous accueillir.