Sélectionner une fonction dans la programmation des sockets

Quelqu’un peut-il me dire comment utiliser et utiliser la fonction select dans la programmation de sockets en c?

La fonction select() vous permet d’implémenter un modèle de conception piloté par un événement lorsque vous devez gérer plusieurs sources d’événement.

Supposons que vous vouliez écrire un programme qui réponde à des événements provenant de plusieurs sources d’événements, par exemple un réseau (via des sockets), une entrée utilisateur (via stdin), d’autres programmes (via des tubes) ou toute autre source d’événements pouvant être représentée par un fd . Vous pouvez démarrer des threads distincts pour gérer chaque source d’événements, mais vous devez gérer les threads et gérer les problèmes de simultanéité. L’autre option consisterait à utiliser un mécanisme permettant d’agréger tout le fd en un seul fdset entité, puis d’appeler une fonction pour attendre le fdset . Cette fonction reviendrait chaque fois qu’un événement surviendrait sur l’un des fd . Vous pouvez vérifier sur quel événement l’événement s’est produit, le lire, le traiter et y répondre. Une fois que vous avez fait cela, vous revenez en arrière et vous assoyez à cette fonction d’attente – jusqu’à ce que survienne un autre événement.

select est un tel mécanisme et la fonction select() est la fonction wait. Vous pouvez trouver les détails sur son utilisation dans un nombre illimité de livres et de ressources en ligne.

La fonction select vous permet de vérifier plusieurs sockets ou pipes (ou n’importe quel descripteur de fichier si vous n’êtes pas sous Windows) et de faire quelque chose en fonction de celui qui est prêt en premier. Plus spécifiquement, les arguments de la fonction select sont divisés en trois groupes:

Lecture: Lorsque l’un des descripteurs de fichier de cette catégorie est prêt à être lu, Select vous les retournera.

Écriture: Lorsque l’un des descripteurs de fichier de cette catégorie est prêt à être écrit, Select vous les retournera.

Exceptionnel: lorsque l’un des descripteurs de fichier de cette catégorie a un cas exceptionnel – c’est-à-dire qu’ils se ferment mal, une connexion est rompue ou qu’ils ont une autre erreur – select les renverra à vous.

Le pouvoir de select réside dans le fait que des fonctions individuelles de fichier / socket / canal bloquent souvent. Select vous permet de surveiller l’activité de plusieurs descripteurs de fichiers différents sans avoir à dédier un fil de votre programme à chaque appel de fonction.

Pour que vous puissiez obtenir une réponse plus précise, vous devrez probablement préciser le langage dans lequel vous programmez. J’ai essayé de donner une réponse aussi générale que possible au niveau conceptuel.

select () est le moyen peu sophistiqué d’interroger les sockets pour de nouvelles données à lire ou pour une fenêtre TCP ouverte à écrire. À moins d’une raison impérieuse, il vaut probablement mieux utiliser poll () ou epoll_wait () si votre plate-forme en dispose, pour de meilleures performances.

Plus de détails seraient utiles, mais je pense que vous faites référence à la méthode Selector.select () de Java NIO.

La réponse simple à votre question est que select () (dans ce contexte) attend qu’un canal (c’est-à-dire l’une des connexions réseau gérées par cet object Selector) dispose de données à lire.

Lorsque vous avez plusieurs connexions ouvertes en même temps, beaucoup / la plupart seront en sumil à tout moment. Cette méthode / classe vous permet de gérer un grand nombre de connexions sans avoir de code distinct pour chaque connexion bloquant cette connexion. Vous pouvez bloquer avec un seul thread plusieurs connexions et recevoir simplement la ou les connexions qui sont “prêtes” pour le moment.

Voici un excellent petit tutoriel qui devrait clarifier les choses:

http://rox-xmlrpc.sourceforge.net/niotut/

Selon la documentation pour les pages de manuel Linux et MSDN pour Windows,

select () et pselect () permettent à un programme de surveiller plusieurs descripteurs de fichier en attendant qu’un ou plusieurs d’entre eux soient “prêts” pour une classe d’opérations d’E / S (par exemple, entrée possible). Un descripteur de fichier est considéré comme prêt s’il est possible d’effectuer l’opération d’E / S correspondante (par exemple, read (2)) sans blocage.

Pour une explication simple: il est souvent nécessaire pour une application de faire plusieurs choses à la fois. Par exemple, vous pouvez accéder à plusieurs sites dans un navigateur Web, un serveur Web peut vouloir servir plusieurs clients simultanément. Il faut un mécanisme pour surveiller chaque socket afin que l’application ne soit pas occupée à attendre la fin d’une communication.

Un exemple: imaginez télécharger une grande page Facebook sur votre smartphone lorsque vous voyagez en train. Votre connexion étant intermittente et lente, le serveur Web doit pouvoir traiter d’autres clients en attendant la fin de votre communication.

  • select (2) – Page de manuel Linux
  • select Function – Fonctions Winsock

J’aime la description sur gnu.org:

Parfois, un programme doit accepter une entrée sur plusieurs canaux d’entrée chaque fois que l’entrée arrive. Par exemple, certains postes de travail peuvent comporter des périphériques tels qu’une tablette à numériser, une zone de boutons de fonction ou une boîte de numérotation connectés via des interfaces série asynchrones normales; Un bon style d’interface utilisateur nécessite de répondre immédiatement à toute saisie sur un périphérique. […]

Vous ne pouvez normalement pas utiliser read à cette fin, car cela bloque le programme jusqu’à ce que l’entrée soit disponible sur un descripteur de fichier particulier; l’entrée sur d’autres canaux ne réveillera rien. Vous pouvez définir le mode non bloquant et interroger chaque descripteur de fichier à son tour, mais cela est très inefficace.

Une meilleure solution consiste à utiliser la fonction select . Ceci bloque le programme jusqu’à ce que l’entrée ou la sortie soit prête sur un ensemble spécifié de descripteurs de fichier, ou jusqu’à l’expiration d’un temporisateur, selon la première éventualité.