ACCEPT |
Accepte |
---|---|
Free Pascal | Sockets |
Syntaxe
Function Accept(Sock:LongInt;Var addr:TInetSockAddr;Var SockIn:file;Var SockOut:file):Boolean; |
Function Accept(Sock:LongInt;Var addr:TInetSockAddr;Var SockIn:text;Var SockOut:text):Boolean; |
Function Accept(Sock:LongInt;Var addr:String;Var SockIn:Text;Var SockOut:Text):Boolean; |
Function Accept(Sock:LongInt;Var addr:String;Var SockIn:file;Var SockOut:file):Boolean; |
Paramètres
Nom | Description |
---|---|
Sock | Ce paramètre permet d'indiquer une représentation de socket d'écoute, ayant été créé et configuré pour accepter les connexions. C'est le descripteur du socket serveur sur lequel Accept va écouter et accepter les connexions entrantes. |
addr | Ce paramètre permet d'indiquer les informations sur l'adresse du client qui se connecte, telles que son adresse IP et son numéro de port. Lorsqu'une connexion est acceptée, addr sera rempli avec ces informations. |
SockIn | Ce paramètre permet d'indiquer une représentation d'un flux d'entrée étant utilisé pour lire les données envoyées par le client après que la connexion ait été acceptée. |
SockOut | Ce paramètre permet d'indiquer une représentation d'un flux de sortie où les données peuvent être envoyées au client. |
Description
Cette fonction permet d'accepter une connexion depuis un socket.
Remarques
- Accept accepte une connexion depuis un socket Sock étant à l'écoute d'une connexion. Si une connexion est acceptée, un descripteur de fichier est renvoyé. En cas d'erreur, -1 est renvoyé. Le socket renvoyé ne peut pas être utilisé pour accepter d'autres connexions. Le socket d'origine reste ouvert.
- L'appel Accept remplit l'adresse de l'entité de connexion dans Addr et définit sa longueur dans Addrlen. Addr doit pointer vers un espace suffisant et Addrlen doit être défini sur la quantité d'espace disponible avant l'appel.
- Les formes alternatives de la commande Accept, avec les paramètres Text ou File, sont équivalentes à l'appel ultérieur de la fonction Accept standard et des fonctions Sock2Text ou Sock2File. Ces fonctions renvoient True en cas de succès, False dans le cas contraire.
- Fonction de gestion des connexions entrantes : La fonction Accept est utilisée pour accepter une connexion entrante sur un serveur TCP. Elle prend en paramètre un socket serveur déjà configuré pour écouter les connexions. Lorsqu'un client tente de se connecter, Accept permet d'établir la connexion avec ce client et crée un nouveau socket pour la communication avec ce client spécifique.
- Blocage de l'exécution : Par défaut, Accept est une fonction bloquante. Cela signifie que si aucune connexion entrante n'est disponible, le programme sera suspendu jusqu'à ce qu'un client tente de se connecter. Ce comportement peut être modifié en utilisant des techniques non-bloquantes ou en configurant le socket en mode fdset pour surveiller plusieurs connexions.
- Création d'un socket de communication dédié : Lorsque Accept accepte une connexion, elle retourne un nouveau descripteur de socket étant utilisé pour la communication avec le client. Le socket d'origine (écoute) reste inchangé et continue à écouter les nouvelles connexions. Ce mécanisme permet d'isoler chaque session de communication avec un client dans son propre socket.
- Utilisation avec l'API réseau de Free Pascal : Accept est utilisée dans le cadre de la gestion des connexions réseau dans Free Pascal. Elle repose sur l'implémentation des sockets en utilisant l'API de la couche transport (TCP/IP), ce qui en fait un outil fondamental pour la construction de serveurs réseau dans ce langage.
- Gestion des erreurs : Si Accept échoue, elle retourne une valeur négative, généralement -1, et la variable SocketError peut être consultée pour obtenir un code d'erreur détaillé. Cela permet de gérer les échecs potentiels, tels qu'un problème de réseau ou une tentative de connexion interrompue par le client.
- Paramètres retournés : En plus du nouveau descripteur de socket pour la communication avec le client, Accept remplit également une structure TSockAddr contenant des informations sur l'adresse du client, comme son adresse IP et son numéro de port. Cela permet au serveur d'identifier l'origine des connexions entrantes et de prendre des décisions en fonction de cette information.
- Utilisation dans des serveurs multi-clients : Accept est essentielle pour gérer les serveurs multi-clients où plusieurs connexions doivent être acceptées et traitées simultanément. Chaque connexion est gérée sur un socket distinct, ce qui permet au serveur d'interagir indépendamment avec chaque client. Les connexions peuvent être gérées dans des processus légers ou des processus différents, ce qui permet de supporter une charge élevée.
- Sécurité et gestion des ressources : Une fois qu'une connexion est acceptée, il est crucial de gérer correctement la ressource socket. Le socket client retourné par Accept doit être fermé une fois la communication terminée, sinon cela peut entraîner des fuites de ressources et des problèmes de performances. De plus, un contrôle d'accès peut être mis en place pour sécuriser l'acceptation des connexions en vérifiant des critères comme l'adresse IP du client ou l'authentification avant de permettre la connexion.
Erreurs
En cas d'erreur, -1 est renvoyé et les erreurs sont signalées dans SocketError et incluent les éléments suivants :
Constante | Description | |
---|---|---|
ESockEBADF | Le descripteur de socket n'est pas valide. | |
ESockENOTSOCK | Le descripteur n'est pas un socket. | |
SYS_EOPNOTSUPP | Le type de socket ne prend pas en charge l'opération d'écoute. | |
ESockEFAULT | L'adresse pointe en dehors de votre espace d'adressage. | |
ESockEWOULDBLOCK | L'opération demandée bloquerait le processus. |
Exemple
Voici un exemple en Free Pascal de l'utilisation de la fonction Accept de l'unité Sockets, permettant de gérer les connexions réseau avec un serveur en utilisant des sockets :
- Program SocketAcceptExample;
-
- {$mode objfpc}
- {$H+}
-
- Uses
- SysUtils, Sockets;
-
- Var
- ListenSock, ClientSock: LongInt;
- Addr: TInetSockAddr;
- SockIn, SockOut: File;
- ClientAddr: TInetSockAddr;
- Buffer: Array[0..255] of Char;
- BytesRead: LongInt;
-
- BEGIN
- { Créer un socket serveur }
- ListenSock := fpSocket(AF_INET, SOCK_STREAM, 0);
- If ListenSock = -1 Then Begin
- WriteLn('Erreur de création de socket.');
- Exit;
- End;
-
- { Configurer l'adresse du serveur }
- Addr.sin_family := AF_INET;
- Addr.sin_port := htons(8080); { Port d'écoute }
- Addr.sin_addr.s_addr := INADDR_ANY;
-
- { Lier le socket à l'adresse et au port }
- If fpBind(ListenSock, @Addr, SizeOf(Addr)) = -1 Then Begin
- WriteLn('Erreur de binding.');
- CloseSocket(ListenSock);
- Exit;
- End;
-
- { Écouter les connexions entrantes }
- If fpListen(ListenSock, 5) = -1 Then Begin
- WriteLn('Erreur de mise en écoute.');
- CloseSocket(ListenSock);
- Exit;
- End;
-
- WriteLn('Serveur en écoute sur le port 8080...');
-
- { Accepter une connexion entrante }
- If Not Accept(ListenSock, ClientAddr, SockIn, SockOut) Then Begin
- WriteLn('Erreur d''acceptation de connexion.');
- CloseSocket(ListenSock);
- Exit;
- End;
-
- WriteLn('Connexion acceptée.');
-
- { Préparer les fichiers de réception et d'envoi }
- Assign(SockIn, ''); { Pas besoin de spécifier de fichier ici, on va utiliser le socket directement }
- Assign(SockOut, '');
- FileMode := fmOpenReadWrite; { Ouvrir les fichiers en mode lecture/écriture }
- Reset(SockIn); { Initialiser le fichier SockIn }
- Reset(SockOut); { Initialiser le fichier SockOut }
-
- { Lire un message depuis le client }
- BytesRead := fpRecv(ClientSock, @Buffer, SizeOf(Buffer) - 1, 0);
- If BytesRead > 0 Then Begin
- Buffer[BytesRead] := #0; { Terminer la chaîne }
- WriteLn('Message du client: ', Buffer);
- End;
-
- { Répondre au client }
- WriteLn(ClientSock, 'Réponse du serveur: Message reçu.');
-
- { Fermer les sockets }
- CloseSocket(ClientSock);
- CloseSocket(ListenSock);
- END.
Voir également
FPListen - Écoutez les connexions sur une prise.
Connect - Ouvrir une connexion à un socket serveur (obsolète).
FPConnect - Ouvrir une connexion à un socket serveur.
FPBind - Lier un socket à une adresse.
Dernière mise à jour : Lundi, le 24 Août 2020