Flux rss

Les fonctions de l'API Socket

 
Collection CommentCaMarche.net
Les sockets

Les fonctions des sockets en détail

La fonction socket()

La création d'un socket se fait grâce à la fonction socket() :

int socket(famille,type,protocole)
  • famille représente la famille de protocole utilisé (AF_INET pour TCP/IP utilisant une adresse Internet sur 4 octets : l'adresse IP ainsi qu'un numéro de port afin de pouvoir avoir plusieurs sockets sur une même machine, AF_UNIX pour les communications UNIX en local sur une même machine)
  • type indique le type de service (orienté connexion ou non). Dans le cas d'un service orienté connexion (c'est généralement le cas), l'argument type doit prendre la valeur SOCK_STREAM (communication par flot de données). Dans le cas contraire (protocole UDP) le paramètre type doit alors valoir SOCK_DGRAM (utilisation de datagrammes, blocs de données)
  • protocole permet de spécifier un protocole permettant de fournir le service désiré. Dans le cas de la suite TCP/IP il n'est pas utile, on le mettra ainsi toujours à 0
La fonction socket() renvoie un entier qui correspond à un descripteur du socket nouvellement créé et qui sera passé en paramètre aux fonctions suivantes. En cas d'erreur, la fonction socket() retourne -1.

Voici un exemple d'utilisation de la fonction socket() :

descripteur = socket(AF_INET,SOCK_STREAM,0);

La fonction bind()

Après création du socket, il s'agit de le lier à un point de communication défini par une adresse et un port, c'est le rôle de la fonction bind() :

bind(int descripteur,sockaddr localaddr,int addrlen)
  • descripteur représente le descripteur du socket nouvellement créé
  • localaddr est une structure qui spécifie l'adresse locale à travers laquelle le programme doit communiquer
    Le format de l'adresse est fortement dépendant du protocole utilisé  :
    • l'interface socket définit une structure standard (sockaddr définie dans <sys/socket.h>) permettant de représenter une adresse :
      struct sockaddr {
      /* longueur effective de l'adresse */
      u_char sa_len;
      
      /* famille de protocole (généralement AF_INET) */
      u_char sa_family;
      
      /* l'adresse complète */
      char sa_data[14];
      
      }
      • sa_len est un octet (u_char) permettant de définir la longueur utile de l'adresse (la partie réellement utilisée de sa_data)
      • sa_family représente la famille de protocole (AF_INET pour TCP/IP)
      • sa_data est une chaîne de 14 caractères (au maximum) contenant l'adresse
    • La structure utilisée avec TCP/IP est une adresse AF_INET (Généralement les structures d'adresses sont redéfinies pour chaque famille d'adresse). Les adresses AF_INET utilisent une structure sockaddr_in définie dans <netinet/in.h> :
      struct sockaddr_in {
      /* famille de protocole (AF_INET) */
      short sin_family;
      
      /* numéro de port */
      u_short sin_port;
      
      /* adresse internet */
      struct in_addr sin_addr;
      
      char sin_zero[8];	/* initialise à zéro */
      }
      • sin_family représente le type de famille
      • sin_port représente le port à contacter
      • sin_addr représente l'adresse de l'hôte
      • sin_zero[8] contient uniquement des zéros (étant donné que l'adresse IP et le port occupent 6 octets, les 8 octets restants doivent être à zéro)
  • addrlen indique la taille du champ localaddr. On utilise généralement sizeof(localaddr).
Voici un exemple d'utilisation de la fonction bind() :
sockaddr_in localaddr ;
localaddr.sin_family = AF_INET; /* Protocole internet */
/* Toutes les adresses IP de la station */
localaddr.sin_addr.s_addr = htonl(INADDR_ANY);

/* port d'écoute par défaut au-dessus des ports réservés */
localaddr.sin_port = htons(port);
if (bind(		  listen_socket,
				   (struct sockaddr*)&localaddr,
				   sizeof(localaddr) )  == SOCKET_ERROR) {
		  // Traitement de l'erreur;

}

Le numéro fictif INADDR_ANY signifie que le socket peut-être associé à n'importe quelle adresse IP de la machine locale (s'il en existe plusieurs). Pour spécifier une adresse IP spécifique à utiliser, il est possible d'utiliser la fonction inet_addr() :

inet_addr("127.0.0.1");

/* utilisation de l'adresse de boucle locale */

Le socket peut être relié à un port libre quelconque en utilisant le numéro 0.

La fonction listen()

La fonction listen() permet de mettre un socket en attente de connexion.

La fonction listen() ne s'utilise qu'en mode connecté (donc avec le protocole TCP)

int listen(int socket,int backlog)
  • socket représente le socket précédemment ouvert
  • backlog représente le nombre maximal de connexions pouvant être mises en attente
La fonction listen() retourne la valeur SOCKET_ERROR en cas de problème, sinon elle retourne 0.

Voici un exemple d'utilisation de la fonction listen() :

if (listen(socket,10) == SOCKET_ERROR) {
// traitement de l'erreur
}

La fonction accept()

La fonction accept() permet la connexion en acceptant un appel :

int accept(int socket,struct sockaddr * addr,int * addrlen)
  • socket représente le socket précédemment ouvert (le socket local)
  • addr représente un tampon destiné à stocker l'adresse de l'appelant
  • addrlen représente la taille de l'adresse de l'appelant
La fonction accept() retourne un identificateur du socket de réponse. Si une erreur intervient la fonction accept() retourne la valeur INVALID_SOCKET.

Voici un exemple d'utilisation de la fonction accept() :

Sockaddr_in Appelant;
/* structure destinée à recueillir les renseignements sur l'appelant
Appelantlen = sizeof(from);

accept(socket_local,(struct sockaddr*)&Appelant, &Appelantlen);

La fonction connect()

La fonction connect() permet d'établir une connexion avec un serveur :

int connect(int socket,struct sockaddr * addr,int * addrlen)
  • socket représente le socket précédemment ouvert (le socket à utiliser)
  • addr représente l'adresse de l'hôte à contacter. Pour établir une connexion, le client ne nécessite pas de faire un bind()
  • addrlen représente la taille de l'adresse de l'hôte à contacter
La fonction connect() retourne 0 si la connexion s'est bien déroulée, sinon -1.

Voici un exemple d'utilisation de la fonction connect(), qui connecte le socket "s" du client sur le port port de l'hôte portant le nom serveur :

toinfo = gethostbyname(serveur);
toaddr = (u_long *)toinfo.h_addr_list[0];

/* Protocole internet */
to.sin_family = AF_INET;

/* Toutes les adresses IP de la station */
to.sin_addr.s_addr = toaddr;

/* port d'écoute par défaut au-dessus des ports réservés */
to.sin_port = htonl(port);

if (connect(socket,(struct sockaddr*)to,sizeof(to)) == -1) {
// Traitement de l'erreur;
}

La fonction recv()

La fonction recv() permet de lire dans un socket en mode connecté (TCP) :

int recv(int socket,char * buffer,int len,int flags)
  • socket représente le socket précédemment ouvert
  • buffer représente un tampon qui recevra les octets en provenance du client
  • len indique le nombre d'octets à lire
  • flags correspond au type de lecture à adopter :
    • le flag MSG_PEEK indiquera que les données lues ne sont pas retirées de la queue de réception
    • le flag MSG_OOB indiquera que les données urgentes (Out Of Band) doivent être lues
    • le flag 0 indique une lecture normale
La fonction recv() renvoie le nombre d'octets lus. De plus cette fonction bloque le processus jusqu'à ce qu'elle reçoive des données.

Voici un exemple d'utilisation de la fonction recv() :

retour = recv(socket,Buffer,sizeof(Buffer),0 );
if (retour == SOCKET_ERROR) {
// traitement de l'erreur
}

La fonction send()

La fonction send() permet d'écrire dans un socket (envoyer des données) en mode connecté (TCP) :

int send(int socket,char * buffer,int len,int flags)
  • socket représente le socket précédemment ouvert
  • buffer représente un tampon contenant les octets à envoyer au client
  • len indique le nombre d'octets à envoyer
  • flags correspond au type d'envoi à adopter :
    • le flag MSG_DONTROUTE indiquera que les données ne routeront pas
    • le flag MSG_OOB indiquera que les données urgentes (Out Of Band) doivent être envoyées
    • le flag 0 indique un envoi normal
La fonction send() renvoie le nombre d'octets effectivement envoyés.

Voici un exemple d'utilisation de la fonction send() :

retour = send(socket,Buffer,sizeof(Buffer),0 );
if (retour == SOCKET_ERROR) {
// traitement de l'erreur
}

Les fonctions close() et shutdown()

La fonction close() permet la fermeture d'un socket en permettant au système d'envoyer les données restantes (pour TCP) :

int close(int socket)
La fonction shutdown() permet la fermeture d'un socket dans un des deux sens (pour une connexion full-duplex) :
int shutdown(int socket,int how)
  • Si how est égal à 0, le socket est fermé en réception
  • Si how est égal à 1, le socket est fermé en émission
  • Si how est égal à 2, le socket est fermé dans les deux sens
close() comme shutdown() retournent -1 en cas d'erreur, 0 si la fermeture se déroule bien.

Ce document intitulé « Les fonctions de l'API Socket » issu de Comment Ça Marche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.

Résultats pour Les fonctions de l'API Socket

Programmation réseau - Les sockets Introduction aux sockets La notion de sockets a été introduite dans les distributions de Berkeley (un fameux système de type UNIX, dont beaucoup de distributions actuelles utilisent des morceaux de code), c'est la raison pour laquelle on parle... www.commentcamarche.net/contents/sockets/sockintro.php3
Liens utiles assembleur x86 Voici quelques liens utiles pour l'assembleur x86. Le but étant de compiler des documents pertinents autant pour ceux qui débutent que pour ceux qui sont à l'aise dans ce domaine. Tutoriels Références complètes Assembleur sous... www.commentcamarche.net/faq/sujet-9899-liens-utiles-assembleur-x86
Déroulement d'une communication avec les sockets Comme dans le cas de l'ouverture d'un fichier, la communication par socket utilise un descripteur pour désigner la connexion sur laquelle on envoie ou reçoit les données. Ainsi la première opération à effectuer consiste à appeler une fonction... www.commentcamarche.net/contents/sockets/sockcomm.php3

Résultats pour Les fonctions de l'API Socket

Faire fonctionner une application Windows sous Linux avec WineWine est un logiciel permettant de faire fonctionne certaines applications Windows sous Linux. Contrairement à VMWare ou VirtualBox, Wine n'émule pas un PC complet, mais seulement les API Win32 (appels système Windows). L'émulation n'est pas... www.commentcamarche.net/faq/sujet-9182-faire-fonctionner-une-application-windows-sous-linux-avec-wine
[PHP] Fonction mail()La fonction mail() est bloquée chez certains des hébergeurs gratuits pour des raisons de sécurité (afin d'éviter le spam notamment), l'adresse ip de la machine qui a demandé le script sera alors indiquée dans le header 'X-MM-Mail-From-IP'. renseignez... www.commentcamarche.net/faq/sujet-117-php-fonction-mail

Résultats pour Les fonctions de l'API Socket

[Socket] JAVA : Ma première Socket (Résolu)Bonjour, Je suis en train de découvrir le joyeux monde des "socket"... Pour l'instant je n'y connais absolument rien si ce n'est le principe global de fonctionnement. Alors je cherche, j'apprends... normal ! Seulement voilà, après... www.commentcamarche.net/forum/affich-2977414-socket-java-ma-premiere-socket
Socket AM2 sur socket A (Résolu)Bonjour, J'aimerais savoir si il est possible de placer un processeur fonctionnant avec un socket AM2 sur un socket A,car j'aimerais refaire un vieux pc www.commentcamarche.net/forum/affich-8183541-socket-am2-sur-socket-a
[C] [Socket] Temps limite d'un connect() (Résolu)Bonsoir, Alors voilà mon soucis, J'ai un socket qui se connecte en tcp sur une machine distante mais au moment où la fonction connect() s'execute, le programme est en attente et la suite ne s'execute pas avant quelques minutes. Mais... www.commentcamarche.net/forum/affich-1864990-c-socket-temps-limite-d-un-connect

Résultats pour Les fonctions de l'API Socket

Télécharger BIOS pour 910GL-M9 (V3.0)Carte mère pourvue d’un socket 775, bon rendement en ce qui concerne le prix pour le grand public, la 910GL-M9 constitue un bon choix pour upgrader un ordinateur. Comme nous le savons tous, le BIOS est à la base même du fonctionnement du système. Si... www.commentcamarche.net/telecharger/telecharger-34057142-bios-pour-910gl-m9-v3-0
Télécharger BIOS pour 915-M5 (V1.1)Carte mère pourvue d’un socket 775, bon rendement en ce qui concerne le prix pour le grand public, la 915-M5 constitue un bon choix pour upgrader un ordinateur. Comme nous le savons tous, le BIOS est à la base même du fonctionnement du système. Si... www.commentcamarche.net/telecharger/telecharger-34057144-bios-pour-915-m5-v1-1
Télécharger BIOS pour 915-A (V1.1)Cette carte mère, socket 775 bien qu’un peu dépassée n’en reste pas moins intéressante du fait qu’elle est a un socket775. Cette version de son BIOS apporte des changements considérables à son fonctionnement : 1. Fixe M0 stepping P4EE CPU qui ne peut... www.commentcamarche.net/telecharger/telecharger-34057143-bios-pour-915-a-v1-1

Résultats pour Les fonctions de l'API Socket

AMD Athlon 64 X2 4600+ Dual Core 2.4 GHz Socket AM2 In a BoxX 2 ,AMD Athlon 64 X2, 2.4 MHz, Socket AM2, Ventilateur CPU inclus,Bus: ,Cache L1:128.0 Ko,Cache L2:512.0 Ko,Divers: ,Fréquence:2400 Mhz,Marque du processeur:AMD Athlon 64 X2,Refroidissement compris,Socket:Socket AM2,Type:Processor,Cache L1:128.0... www.commentcamarche.net/guide-achat/amd-athlon-64-x2-4600-dual-core-2-4-ghz-socket-am2-in-a-box-665231-fiche-technique
Intel Core 2 Duo Mobile P8400 2.26 GHz Socket P 1066 MHz bus In a BoxP 8400,Intel Core 2 Duo Mobile,2.26 MHz,Socket P,Ventilateur CPU inclus,Type:Processeur,Refroidissement compris,Socket:Socket P,Marque du processeur:Intel Core 2 Duo Mobile,Nbre de coeurs:Dual Coeur,Divers: ,Fréquence:2.26 GHz,Cache L2:3072.0... www.commentcamarche.net/guide-achat/intel-core-2-duo-mobile-p8400-2-26-ghz-socket-p-1066-mhz-bus-in-a-box-1124367-fiche-technique
AMD Phenom 9550 2.83 GHz Socket AM2+ 1000 MHz bus In a BoxAM 2,AMD Phenom Quad,2830 MHz,Socket AM2,Bus:1000.0 MHz,Cache L1:128.0 Ko,Cache L2:4096.0 Ko,Divers: ,Fréquence:2830.0 GHz,Marque du processeur:AMD Phenom Quad,Nbre de coeurs:Quadruple Coeur,Socket:Socket AM2,Type:Processor Upgrade www.commentcamarche.net/guide-achat/amd-phenom-9550-2-83-ghz-socket-am2-1000-mhz-bus-in-a-box-1083380-fiche-technique

Résultats pour Les fonctions de l'API Socket

Langages informatiques - APIAPI Une API (Application Programmable Interface, traduisez « interface de programmation » ou « interface pour l’accès programmé aux applications) est un ensemble de fonctions permettant d’accéder aux services d’une application, par l’intermédiaire... www.commentcamarche.net/contents/langages/api.php3
Cryptographie - Secure Sockets Layers (SSL)Introduction à SSL SSL (Secure Sockets Layers, que l'on pourrait traduire par couche de sockets sécurisée) est un procédé de sécurisation des transactions effectuées via Internet. Le standard SSL a été mis au point par Netscape, en... www.commentcamarche.net/contents/crypto/ssl.php3
PHP - Les fonctionsLa notion de fonction On appelle fonction un sous-programme qui permet d'effectuer un ensemble d'instructions par simple appel de la fonction dans le corps du programme principal. Les fonctions permettent d'exécuter dans plusieurs parties du... www.commentcamarche.net/contents/php/phpfonc.php3