[{"@context":"http:\/\/schema.org\/","@type":"BlogPosting","@id":"https:\/\/wiki.edu.vn\/en2fr\/wiki28\/berkeley-sockets-wikipedia\/#BlogPosting","mainEntityOfPage":"https:\/\/wiki.edu.vn\/en2fr\/wiki28\/berkeley-sockets-wikipedia\/","headline":"Berkeley Sockets – Wikipedia wiki","name":"Berkeley Sockets – Wikipedia wiki","description":"before-content-x4 API de communication inter-processus after-content-x4 Sockets de Berkeley est une interface de programmation d’applications (API) pour les prises Internet","datePublished":"2020-01-24","dateModified":"2020-01-24","author":{"@type":"Person","@id":"https:\/\/wiki.edu.vn\/en2fr\/wiki28\/author\/lordneo\/#Person","name":"lordneo","url":"https:\/\/wiki.edu.vn\/en2fr\/wiki28\/author\/lordneo\/","image":{"@type":"ImageObject","@id":"https:\/\/secure.gravatar.com\/avatar\/c9645c498c9701c88b89b8537773dd7c?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c9645c498c9701c88b89b8537773dd7c?s=96&d=mm&r=g","height":96,"width":96}},"publisher":{"@type":"Organization","name":"Enzyklop\u00e4die","logo":{"@type":"ImageObject","@id":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","url":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","width":600,"height":60}},"image":{"@type":"ImageObject","@id":"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/a\/a1\/InternetSocketBasicDiagram_zhtw.png\/220px-InternetSocketBasicDiagram_zhtw.png","url":"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/a\/a1\/InternetSocketBasicDiagram_zhtw.png\/220px-InternetSocketBasicDiagram_zhtw.png","height":"314","width":"220"},"url":"https:\/\/wiki.edu.vn\/en2fr\/wiki28\/berkeley-sockets-wikipedia\/","wordCount":10961,"articleBody":" (adsbygoogle = window.adsbygoogle || []).push({});before-content-x4API de communication inter-processus (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4Sockets de Berkeley est une interface de programmation d’applications (API) pour les prises Internet et les prises de domaine UNIX, utilis\u00e9es pour la communication inter-processus (IPC). Il est g\u00e9n\u00e9ralement mis en \u0153uvre en tant que biblioth\u00e8que de modules liens. Il est originaire du syst\u00e8me d’exploitation de 4,2BSD UNIX, qui a \u00e9t\u00e9 publi\u00e9 en 1983. Une prise est une repr\u00e9sentation abstraite (poign\u00e9e) pour le point de terminaison local d’un chemin de communication r\u00e9seau. L’API Berkeley Sockets le repr\u00e9sente comme un descripteur de fichier (poign\u00e9e de fichier) dans la philosophie UNIX qui fournit une interface commune pour l’entr\u00e9e et la sortie aux flux de donn\u00e9es. Les prises de Berkeley ont \u00e9volu\u00e9 avec peu de modification d’un En fait Standard dans un composant de la sp\u00e9cification POSIX. Le terme POSIX SOCKETS est essentiellement synonyme de Sockets de Berkeley , mais ils sont \u00e9galement connus comme Sockets BSD , reconnaissant la premi\u00e8re impl\u00e9mentation dans la distribution du logiciel Berkeley. (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4 Table of ContentsHistorique et impl\u00e9mentations [ modifier ]] Sockets BSD et POSIX [ modifier ]] Alternatives [ modifier ]] Fonctions API de socket [ modifier ]] prise [ modifier ]] lier [ modifier ]] \u00e9couter [ modifier ]] accepter [ modifier ]] connecter [ modifier ]] Gethostbyname et Gethostbyaddr [ modifier ]] Protocole et adresser les familles [ modifier ]] Prises brutes [ modifier ]] Mode de blocage et non bloquant [ modifier ]] Terminer les prises [ modifier ]] Exemple client-serveur \u00e0 l’aide de TCP [ modifier ]] Serveur [ modifier ]] Client [ modifier ]] Exemple de serveur client utilisant UDP [ modifier ]] Serveur [ modifier ]] Client [ modifier ]] Les r\u00e9f\u00e9rences [ modifier ]] Liens externes [ modifier ]] Historique et impl\u00e9mentations [ modifier ]] Berkeley Sockets est originaire du syst\u00e8me d’exploitation 4.2BSD UNIX, publi\u00e9 en 1983, en tant qu’interface de programmation. Ce n’est qu’en 1989, cependant, la publication de la biblioth\u00e8que de r\u00e9seaux de l’Universit\u00e9 de Californie pourrait publier des versions de syst\u00e8me d’exploitation et de r\u00e9seautage des contraintes de licence de l’Unix propri\u00e9taire d’AT&T Corporation. Tous les syst\u00e8mes d’exploitation modernes impl\u00e9mentent une version de l’interface Berkeley Socket. Il est devenu l’interface standard pour les applications ex\u00e9cut\u00e9es sur Internet. M\u00eame l’impl\u00e9mentation Winsock pour MS Windows, cr\u00e9\u00e9e par des d\u00e9veloppeurs non affili\u00e9s, suit \u00e9troitement la norme. (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4L’API BSD Sockets est \u00e9crite dans le langage de programmation C. La plupart des autres langages de programmation fournissent des interfaces similaires, g\u00e9n\u00e9ralement \u00e9crites comme une biblioth\u00e8que de wrapper bas\u00e9e sur l’API C. [d’abord] Sockets BSD et POSIX [ modifier ]] Au fur et \u00e0 mesure que l’API Berkeley Socket a \u00e9volu\u00e9 et a finalement donn\u00e9 l’API Posix Socket, [2] Certaines fonctions ont \u00e9t\u00e9 obsol\u00e8tes ou supprim\u00e9es et remplac\u00e9es par d’autres. L’API POSIX est \u00e9galement con\u00e7ue pour \u00eatre r\u00e9entrente et prend en charge IPv6. Action BSD Posix Conversion de l’adresse texte \u00e0 l’adresse emball\u00e9e INET_ATON INET_PTON Conversion de l’adresse emball\u00e9e \u00e0 l’adresse texte INET_NTOA INET_NTOP Recherche vers l’avant pour le nom \/ service de l’h\u00f4te Gethostbyname, GethostbyAddr, getServbyname, getServbyport getaddrinfo Recherche invers\u00e9e pour le nom \/ service de l’h\u00f4te gethostbyaddr, getervbyport getNameinfo Alternatives [ modifier ]] L’API d’interface de couche de transport bas\u00e9e sur les cours d’eau (TLI) offre une alternative \u00e0 l’API de socket. De nombreux syst\u00e8mes qui fournissent l’API TLI fournissent \u00e9galement l’API Berkeley Socket. Les syst\u00e8mes non UNIX exposent souvent l’API Berkeley Socket avec une couche de traduction \u00e0 une API de mise en r\u00e9seau native. Plan 9 [3] et Genode [4] Utilisez des API de syst\u00e8me de fichiers avec des fichiers de contr\u00f4le plut\u00f4t que des descripteurs de fichiers. L’interface de socket Berkeley est d\u00e9finie dans plusieurs fichiers d’en-t\u00eate. Les noms et le contenu de ces fichiers diff\u00e8rent l\u00e9g\u00e8rement entre les impl\u00e9mentations. En g\u00e9n\u00e9ral, ils incluent: D\u00e9poser Description sys \/ socket.h Fonctions de prise de base et structures de donn\u00e9es. netinet \/ in.h AF_INET et AF_INET6 Adresse les familles et leurs familles de protocole correspondantes, PF_INET et PF_INET6. Il s’agit notamment des adresses IP standard et des num\u00e9ros de port TCP et UDP. sys \/ un.h PF_UNIX et PF_LOCAL ADRESS FAMILLE. Utilis\u00e9 pour la communication locale entre les programmes ex\u00e9cut\u00e9s sur le m\u00eame ordinateur. Arpa \/ inet.h Fonctions pour manipuler les adresses IP num\u00e9riques. netdb.h Fonctions pour traduire les noms de protocole et les noms d’h\u00f4tes en adresses num\u00e9riques. Recherche les donn\u00e9es locales ainsi que les services de noms. Fonctions API de socket [ modifier ]] Diagramme de flux de la transaction client-serveur \u00e0 l’aide de sockets avec le protocole de contr\u00f4le de transmission (TCP). L’API Berkeley Socket fournit g\u00e9n\u00e9ralement les fonctions suivantes: prise() Cr\u00e9e une nouvelle prise d’un certain type, identifi\u00e9 par un num\u00e9ro entier, et y attribue des ressources syst\u00e8me. lier() est g\u00e9n\u00e9ralement utilis\u00e9 du c\u00f4t\u00e9 du serveur et associe une prise \u00e0 une structure d’adresse de socket, c’est-\u00e0-dire une adresse IP locale sp\u00e9cifi\u00e9e et un num\u00e9ro de port. \u00e9couter() est utilis\u00e9 du c\u00f4t\u00e9 du serveur et provoque une prise TCP li\u00e9e \u00e0 entrer dans l’\u00e9tat d’\u00e9coute. connecter() est utilis\u00e9 c\u00f4t\u00e9 client et attribue un num\u00e9ro de port local gratuit \u00e0 une prise. Dans le cas d’une prise TCP, elle provoque une tentative d’\u00e9tablir une nouvelle connexion TCP. accepter() est utilis\u00e9 du c\u00f4t\u00e9 du serveur. Il accepte une tentative entrante re\u00e7ue de cr\u00e9er une nouvelle connexion TCP \u00e0 partir du client distant et cr\u00e9e un nouveau socket associ\u00e9 \u00e0 la paire d’adresses de socket de cette connexion. envoyer() , recv () , Sento () , et recvfrom () sont utilis\u00e9s pour envoyer et recevoir des donn\u00e9es. Les fonctions standard \u00e9crire() et lire() peut \u00e9galement \u00eatre utilis\u00e9. fermer() provoque la lib\u00e9ration des ressources du syst\u00e8me allou\u00e9es \u00e0 une prise. En cas de TCP, la connexion est termin\u00e9e. gethostbyname () et GethostbyAddr () sont utilis\u00e9s pour r\u00e9soudre les noms et adresses d’h\u00f4tes. IPv4 uniquement. getAddrinfo () et freeaddrinfo () sont utilis\u00e9s pour r\u00e9soudre les noms et adresses d’h\u00f4tes. IPv4, IPv6. s\u00e9lectionner() est utilis\u00e9 pour suspendre, en attendant qu’une ou plusieurs d’une liste fournie de sockets soient pr\u00eates \u00e0 lire, pr\u00eates \u00e0 \u00e9crire ou qui ont des erreurs. sondage() est utilis\u00e9 pour v\u00e9rifier l’\u00e9tat d’une prise dans un ensemble de prises. L’ensemble peut \u00eatre test\u00e9 pour voir si une prise peut \u00eatre \u00e9crite, lire \u00e0 partir ou si une erreur s’est produite. getockopt () est utilis\u00e9 pour r\u00e9cup\u00e9rer la valeur actuelle d’une option de socket particuli\u00e8re pour la prise sp\u00e9cifi\u00e9e. setsockopt () est utilis\u00e9 pour d\u00e9finir une option de prise particuli\u00e8re pour la prise sp\u00e9cifi\u00e9e. prise [ modifier ]] La fonction prise() Cr\u00e9e un point de terminaison pour la communication et renvoie un descripteur de fichier pour la prise. Il utilise trois arguments: domaine , qui sp\u00e9cifie la famille du protocole de la prise cr\u00e9\u00e9e. Par exemple:De_INET pour le protocole r\u00e9seau IPv4 (IPv4 uniquement) Af_inet6 pour IPv6 (et dans certains cas, compatible en arri\u00e8re avec IPv4) Af_unix pour la prise locale (\u00e0 l’aide d’un n\u0153ud de syst\u00e8me de fichiers sp\u00e9cial) taper , un des:Sock_stream (Service de flux fiable ou sockets de flux) Sock_dgram (Service Datagram ou Sockets Datagram) Sock_seqpacket (Service de paquets s\u00e9quenc\u00e9s fiable) Sock_raw (protocoles bruts au sommet de la couche r\u00e9seau) protocole Sp\u00e9cification du protocole de transport r\u00e9el \u00e0 utiliser. Les plus courants sont Protot_tcp , Protot_sctp , Proto_udp , Protot_dccp . Ces protocoles sont sp\u00e9cifi\u00e9s dans le fichier netinet \/ in.h . La valeur 0 Peut \u00eatre utilis\u00e9 pour s\u00e9lectionner un protocole par d\u00e9faut dans le domaine et le type s\u00e9lectionn\u00e9s. La fonction renvoie -d’abord Si une erreur s’est produite. Sinon, il renvoie un entier repr\u00e9sentant le descripteur nouvellement affect\u00e9. lier [ modifier ]] lier() associe une prise \u00e0 une adresse. Lorsqu’une prise est cr\u00e9\u00e9e avec prise() , il ne re\u00e7oit qu’une famille de protocole, mais n’a pas \u00e9t\u00e9 attribu\u00e9 d’adresse. Cette association doit \u00eatre effectu\u00e9e avant que le socket puisse accepter les connexions des autres h\u00f4tes. La fonction a trois arguments: sockfd , un descripteur repr\u00e9sentant la prise my_addr , un pointeur vers un sockddr structure repr\u00e9sentant l’adresse \u00e0 lier. ajouter \u00e0 , un champ de type socklen_t sp\u00e9cifiant la taille du sockddr structure. lier() Renvoie 0 sur le succ\u00e8s et -1 si une erreur se produit. \u00e9couter [ modifier ]] Une fois qu’une prise a \u00e9t\u00e9 associ\u00e9e \u00e0 une adresse, \u00e9couter() Le pr\u00e9pare pour les connexions entrantes. Cependant, cela n’est n\u00e9cessaire que pour les modes de donn\u00e9es orient\u00e9s vers le flux (orient\u00e9 connexion), c’est-\u00e0-dire pour les types de socket ( Sock_stream , Sock_seqpacket ). \u00e9couter() n\u00e9cessite deux arguments: sockfd , un descripteur de socket valide. arri\u00e9r\u00e9 , un entier repr\u00e9sentant le nombre de connexions en attente qui peuvent \u00eatre mis en file d’attente \u00e0 tout moment. Le syst\u00e8me d’exploitation place g\u00e9n\u00e9ralement un plafond sur cette valeur. Une fois qu’une connexion est accept\u00e9e, elle est d\u00e9sactiv\u00e9e. Au succ\u00e8s, 0 est retourn\u00e9. Si une erreur se produit, -1 est renvoy\u00e9. accepter [ modifier ]] Lorsqu’une application \u00e9coute des connexions ax\u00e9es sur le flux provenant d’autres h\u00f4tes, il est inform\u00e9 de ces \u00e9v\u00e9nements (cf. SELECT () fonction) et doit initialiser la connexion \u00e0 l’aide de la fonction accepter() . Il cr\u00e9e une nouvelle prise pour chaque connexion et supprime la connexion de la file d’attente d’\u00e9coute. La fonction a les arguments suivants: sockfd , Le descripteur de la prise d’\u00e9coute qui a la file d’attente de connexion. intelligent , un pointeur vers une structure Sockaddr pour recevoir les informations d’adresse du client. ajouter \u00e0 , un pointeur vers un socklen_t Emplacement qui sp\u00e9cifie la taille de la structure d’adresse du client transmise pour accepter (). Quand accepter() Renvoie, cet emplacement contient la taille (en octets) de la structure. accepter() Renvoie le nouveau descripteur de socket pour la connexion accept\u00e9e ou la valeur -d’abord Si une erreur se produit. Toute communication suppl\u00e9mentaire avec l’h\u00f4te distant se produit d\u00e9sormais via cette nouvelle prise. Les prises de donn\u00e9es ne n\u00e9cessitent pas de traitement par accepter () car le r\u00e9cepteur peut imm\u00e9diatement r\u00e9pondre \u00e0 la demande \u00e0 l’aide de la prise d’\u00e9coute. connecter [ modifier ]] connecter() \u00c9tablit un lien de communication direct \u00e0 un h\u00f4te distant sp\u00e9cifique identifi\u00e9 par son adresse via une prise, identifi\u00e9e par son descripteur de fichier. Lorsque vous utilisez un protocole ax\u00e9 sur la connexion, cela \u00e9tablit une connexion. Certains types de protocoles sont sans connexion, notamment le protocole de datagramme utilisateur. Lorsqu’il est utilis\u00e9 avec des protocoles sans connexion, connecter d\u00e9finit l’adresse distante pour l’envoi et la r\u00e9ception de donn\u00e9es, permettant l’utilisation de fonctions telles que envoyer et recv . Dans ces cas, la fonction de connexion emp\u00eache la r\u00e9ception des datagrammes d’autres sources. connecter() Renvoie un entier repr\u00e9sentant le code d’erreur: 0 repr\u00e9sente le succ\u00e8s, tandis que -d’abord repr\u00e9sente une erreur. Historiquement, dans les syst\u00e8mes d\u00e9riv\u00e9s de BSD, l’\u00e9tat d’un descripteur de socket n’est pas d\u00e9fini si l’appel \u00e0 connecter \u00c9chec (comme il est sp\u00e9cifi\u00e9 dans la sp\u00e9cification UNIX unique), donc, les applications portables doivent fermer imm\u00e9diatement le descripteur de socket et obtenir un nouveau descripteur avec socket (), dans le cas o\u00f9 l’appel \u00e0 connecter () \u00e9choue. Gethostbyname et Gethostbyaddr [ modifier ]] Les fonctions gethostbyname () et GethostbyAddr () sont utilis\u00e9s pour r\u00e9soudre les noms et adresses d’h\u00f4tes dans le syst\u00e8me de noms de domaine ou les autres m\u00e9canismes de r\u00e9solveur de l’h\u00f4te local (par exemple, \/ etc \/ la recherche d’h\u00f4tes). Ils renvoient un pointeur \u00e0 un objet de type HOSTENT STRUCT , qui d\u00e9crit un h\u00f4te de protocole Internet. Les fonctions utilisent les arguments suivants: nom Sp\u00e9cifie le nom DNS de l’h\u00f4te. addr Sp\u00e9cifie un pointeur vers un struct in_addr contenant l’adresse de l’h\u00f4te. seul sp\u00e9cifie la longueur, en octets, de addr . taper Sp\u00e9cifie le type de famille d’adresse (par exemple, AF_INET) de l’adresse h\u00f4te. Les fonctions renvoient un pointeur nul en cas d’erreur, auquel cas l’entier externe h_errno Peut \u00eatre v\u00e9rifi\u00e9 pour voir s’il s’agit d’une d\u00e9faillance temporaire ou d’un h\u00f4te non valide ou inconnu. Sinon un valide structure h\u00f4te * est retourn\u00e9. Ces fonctions ne sont pas strictement un composant de l’API de socket BSD, mais sont souvent utilis\u00e9es conjointement avec les fonctions de l’API. De plus, ces fonctions sont d\u00e9sormais consid\u00e9r\u00e9es comme des interfaces h\u00e9rit\u00e9es pour interroger le syst\u00e8me de noms de domaine. De nouvelles fonctions qui sont enti\u00e8rement autoris\u00e9es au protocole (support IPv6) ont \u00e9t\u00e9 d\u00e9finies. Ces nouvelles fonctions sont getAddrinfo () et getNameInfo (), et sont bas\u00e9es sur un nouveau addrinfo Structure de donn\u00e9es. Protocole et adresser les familles [ modifier ]] L’API Berkeley Socket est une interface g\u00e9n\u00e9rale pour la mise en r\u00e9seau et la communication interpro\u00e7ue, et prend en charge l’utilisation de divers protocoles de r\u00e9seau et architectures d’adresse. Ce qui suit r\u00e9pertorie un \u00e9chantillon de familles de protocoles (pr\u00e9c\u00e9d\u00e9s de l’identifiant symbolique standard) d\u00e9fini dans une impl\u00e9mentation Linux ou BSD moderne: Une prise pour les communications est cr\u00e9\u00e9e avec le prise() fonction, en sp\u00e9cifiant la famille du protocole souhait\u00e9 ( Pf_ -Identificateur) comme argument. Le concept de conception original de l’interface de socket se distinguait entre les types de protocole (familles) et les types d’adresses sp\u00e9cifiques que chacun peut utiliser. Il a \u00e9t\u00e9 envisag\u00e9 qu’une famille de protocole puisse avoir plusieurs types d’adresses. Les types d’adresses ont \u00e9t\u00e9 d\u00e9finis par des constantes symboliques suppl\u00e9mentaires, en utilisant le pr\u00e9fixe DE au lieu de PF . Le DE -Les identificateurs sont destin\u00e9s \u00e0 toutes les structures de donn\u00e9es qui traitent sp\u00e9cifiquement du type d’adresse et non de la famille du protocole.Cependant, ce concept de s\u00e9paration du protocole et du type d’adresse n’a pas trouv\u00e9 de support de mise en \u0153uvre et le DE -Les soci\u00e9t\u00e9s ont \u00e9t\u00e9 d\u00e9finies par l’identifiant de protocole correspondant, laissant la distinction entre DE et PF constantes comme argument technique sans cons\u00e9quence pratique. En effet, une grande confusion existe dans l’utilisation appropri\u00e9e des deux formes. [6] La sp\u00e9cification POSIX.1\u20142008 ne sp\u00e9cifie aucun PF -Constants, mais seulement DE -Constants [7] Prises brutes [ modifier ]] Les prises brutes fournissent une interface simple qui contourne le traitement par la pile TCP \/ IP de l’h\u00f4te. Ils permettent la mise en \u0153uvre de protocoles de r\u00e9seautage dans l’espace utilisateur et aident \u00e0 d\u00e9boguer de la pile de protocoles. [8] Les prises brutes sont utilis\u00e9es par certains services, tels que ICMP, qui fonctionnent sur la couche Internet du mod\u00e8le TCP \/ IP. Mode de blocage et non bloquant [ modifier ]] Les prises de Berkeley peuvent fonctionner dans l’un des deux modes: blocage ou non bloquant. Une prise de blocage ne renvoie pas le contr\u00f4le avant d’avoir envoy\u00e9 (ou re\u00e7u) certaines ou toutes les donn\u00e9es sp\u00e9cifi\u00e9es pour l’op\u00e9ration. Il est normal qu’une prise de blocage de ne pas envoyer toutes les donn\u00e9es. La demande doit v\u00e9rifier la valeur de retour pour d\u00e9terminer le nombre d’octets envoy\u00e9s ou re\u00e7us et il doit renvoyer les donn\u00e9es non d\u00e9j\u00e0 trait\u00e9es. [9] Lorsque vous utilisez des prises de blocage, une consid\u00e9ration particuli\u00e8re doit \u00eatre accord\u00e9e \u00e0 accepter () car elle peut toujours bloquer apr\u00e8s avoir indiqu\u00e9 la lisibilit\u00e9 si un client se d\u00e9connecte pendant la phase de connexion. Un socket non bloquant renvoie tout ce qui se trouve dans le tampon de r\u00e9ception et se poursuit imm\u00e9diatement. S’il n’est pas \u00e9crit correctement, les programmes utilisant des prises non bloquantes sont particuli\u00e8rement sensibles aux conditions de course en raison des variances de la vitesse de liaison du r\u00e9seau. [ citation requise ]] Une prise est g\u00e9n\u00e9ralement d\u00e9finie sur le mode de blocage ou de non-blocage \u00e0 l’aide des fonctions FCNTL et IOCTL. Terminer les prises [ modifier ]] Le syst\u00e8me d’exploitation ne lib\u00e8re pas les ressources allou\u00e9es \u00e0 une prise jusqu’\u00e0 ce que la prise est ferm\u00e9e. Ceci est particuli\u00e8rement important si le connecter L’appel \u00e9choue et sera r\u00e9cit\u00e9. Lorsqu’une application ferme une prise, seule l’interface vers la prise est d\u00e9truite. Il est de la responsabilit\u00e9 du noyau de d\u00e9truire la prise en interne. Parfois, une prise peut entrer TEMPS D’ATTENTE \u00c9tat, du c\u00f4t\u00e9 du serveur, jusqu’\u00e0 4 minutes. [dix] Sur les syst\u00e8mes SVR4 Utilisation de fermer() peut \u00e9liminer les donn\u00e9es. L’utilisation de fermer() ou So_linger peut \u00eatre n\u00e9cessaire sur ces syst\u00e8mes pour garantir la livraison de toutes les donn\u00e9es. [11] Exemple client-serveur \u00e0 l’aide de TCP [ modifier ]] Le protocole de contr\u00f4le de transmission (TCP) est un protocole ax\u00e9 sur la connexion qui fournit une vari\u00e9t\u00e9 de fonctionnalit\u00e9s de correction d’erreur et de performances pour la transmission des flux d’octets. Un processus cr\u00e9e une prise TCP en appelant le prise() fonction avec les param\u00e8tres de la famille du protocole ( PF INET , Pf_inet6 ), le mode socket pour les sockets de flux ( Sock_stream ), et l’identifiant du protocole IP pour TCP ( Protot_tcp ). Serveur [ modifier ]] L’\u00e9tablissement d’un serveur TCP implique les \u00e9tapes de base suivantes: Cr\u00e9ation d’une prise TCP avec un appel \u00e0 prise(). Liant la prise au port d’\u00e9coute ( lier() ) Apr\u00e8s avoir r\u00e9gl\u00e9 le num\u00e9ro de port. Pr\u00e9parer la prise pour \u00e9couter les connexions (ce qui en fait une prise d’\u00e9coute), avec un appel \u00e0 \u00e9couter() . Accepter des connexions entrantes ( accepter() ). Cela bloque le processus jusqu’\u00e0 ce qu’une connexion entrante soit re\u00e7ue et renvoie un descripteur de socket pour la connexion accept\u00e9e. Le descripteur initial reste un descripteur d’\u00e9coute, et accepter() Peut \u00eatre appel\u00e9 \u00e0 nouveau \u00e0 tout moment avec cette prise, jusqu’\u00e0 ce qu’elle soit ferm\u00e9e. Communiquer avec l’h\u00f4te distant avec les fonctions API envoyer() et recv () , ainsi qu’avec les fonctions \u00e0 usage g\u00e9n\u00e9ral \u00e9crire() et lire() . Cl\u00f4ture de chaque prise ouverte apr\u00e8s utilisation avec la fonction fermer() Le programme suivant cr\u00e9e un serveur TCP \u00e9coutant sur le num\u00e9ro de port 1100: #inclure #inclure #inclure #inclure #inclure #inclure #inclure #include int main(void) { struct sockaddr_in sa; int SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (SocketFD == -1) { perror(\"cannot create socket\"); exit(EXIT_FAILURE); } memset(&sa, 0, sizeof sa); sa.sin_family = AF_INET; sa.sin_port = htons(1100); sa.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(SocketFD,(struct sockaddr *)&sa, sizeof sa) == -1) { perror(\"bind failed\"); close(SocketFD); exit(EXIT_FAILURE); } if (listen(SocketFD, 10) == -1) { perror(\"listen failed\"); close(SocketFD); exit(EXIT_FAILURE); } for (;;) { int ConnectFD = accept(SocketFD, NULL, NULL); if (ConnectFD == -1) { perror(\"accept failed\"); close(SocketFD); exit(EXIT_FAILURE); } \/* perform read write operations ... read(ConnectFD, buff, size) *\/ if (shutdown(ConnectFD, SHUT_RDWR) == -1) { perror(\"shutdown failed\"); close(ConnectFD); close(SocketFD); exit(EXIT_FAILURE); } close(ConnectFD); } close(SocketFD); return EXIT_SUCCESS; }Client [ modifier ]] La programmation d’une application client TCP implique les \u00e9tapes suivantes: Cr\u00e9ation d’une prise TCP. Connexion au serveur ( connecter() ), en passant un sockaddr_in structure avec le sin_family mis \u00e0 De_INET , Sin_port D\u00e9fini sur le port, le point de terminaison est \u00e0 l’\u00e9coute (dans l’ordre des octets de r\u00e9seau) et sin_addr D\u00e9fini sur l’adresse IP du serveur d’\u00e9coute (\u00e9galement dans l’ordre des octets r\u00e9seau). Communiquer avec l’h\u00f4te distant avec les fonctions API envoyer() et recv () , ainsi qu’avec les fonctions \u00e0 usage g\u00e9n\u00e9ral \u00e9crire() et lire() . Cl\u00f4ture de chaque prise ouverte apr\u00e8s utilisation avec la fonction fermer(). #inclure #inclure #inclure #inclure #inclure #inclure #inclure #include int main(void) { struct sockaddr_in sa; int res; int SocketFD; SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (SocketFD == -1) { perror(\"cannot create socket\"); exit(EXIT_FAILURE); } memset(&sa, 0, sizeof sa); sa.sin_family = AF_INET; sa.sin_port = htons(1100); res = inet_pton(AF_INET, \"192.168.1.3\", &sa.sin_addr); if (connect(SocketFD, (struct sockaddr *)&sa, sizeof sa) == -1) { perror(\"connect failed\"); close(SocketFD); exit(EXIT_FAILURE); } \/* perform read write operations ... *\/ close(SocketFD); return EXIT_SUCCESS; }Exemple de serveur client utilisant UDP [ modifier ]] Le protocole de datagramme utilisateur (UDP) est un protocole sans connexion sans garantie de livraison. Les paquets UDP peuvent arriver hors service, plusieurs fois, ou pas du tout. En raison de cette conception minimale, l’UDP a consid\u00e9rablement moins de frais g\u00e9n\u00e9raux que TCP. \u00catre sans connexion signifie qu’il n’y a pas de concept de flux ou de connexion permanente entre deux h\u00f4tes. Ces donn\u00e9es sont appel\u00e9es Datagrams (Datagram Sockets). L’espace d’adressage UDP, l’espace des num\u00e9ros de port UDP (en terminologie ISO, le TSAPS), est compl\u00e8tement disjoint \u00e0 partir de celui des ports TCP. Serveur [ modifier ]] Une application peut configurer un serveur UDP sur le num\u00e9ro de port 7654 comme suit. Les programmes contient une boucle infinie qui re\u00e7oit des donn\u00e9es de donn\u00e9es UDP avec fonction recvfrom () . #inclure #inclure #inclure #inclure #inclure #inclure #inclure \/ * pour close () pour socket * \/ #include int main(void){ int sock; struct sockaddr_in sa; char buffer[1024]; ssize_t recsize; socklen_t fromlen; memset(&sa, 0, sizeof sa); sa.sin_family = AF_INET; sa.sin_addr.s_addr = htonl(INADDR_ANY); sa.sin_port = htons(7654); fromlen = sizeof sa; sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); if (bind(sock, (struct sockaddr *)&sa, sizeof sa) == -1) { perror(\"error bind failed\"); close(sock); exit(EXIT_FAILURE); } for (;;) { recsize = recvfrom(sock, (void*)buffer, sizeof buffer, 0, (struct sockaddr*)&sa, &fromlen); if (recsize (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4"},{"@context":"http:\/\/schema.org\/","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https:\/\/wiki.edu.vn\/en2fr\/wiki28\/#breadcrumbitem","name":"Enzyklop\u00e4die"}},{"@type":"ListItem","position":2,"item":{"@id":"https:\/\/wiki.edu.vn\/en2fr\/wiki28\/berkeley-sockets-wikipedia\/#breadcrumbitem","name":"Berkeley Sockets – Wikipedia wiki"}}]}]