Programmation de sockets en C

Plus d’un processus client envoie des messages à un serveur et reçoit des messages à son tour. Un processus client envoie plusieurs messages au serveur. Désormais, un processus client se connecte au serveur chaque fois qu’un message doit être envoyé et que les messages provenant de différents processus clients sont reçus de manière entrelacée par le serveur.

Comment reconnaître un client? Je veux dire, un processus client a-t-il une valeur d’identité sur le serveur et est-il identique pour un processus même s’il se connecte plusieurs fois?

Merci

À moins que vous ne souhaitiez identifier que par l’adresse IP du client, vous devrez append une sorte de jeton à la communication. Vous pouvez (par exemple) append un message au début de la conversation demandant un jeton unique, puis demander que le même jeton soit envoyé dans chaque message de ce client.

Pour communiquer via une connexion, vous devez accept(2) cette connexion. Qu’est-ce que l’acceptation nous dit?

 int accept(int socket, struct sockaddr *ressortingct address, socklen_t *ressortingct address_len); 

Adresse est “l’identification” de la connexion. Donc, fondamentalement, vous pouvez le faire de cette façon:

  • Lorsque quelqu’un se connecte, enregistrez son socket (c’est ce accept(2) retourne accept(2) ) et son adresse.
  • Lorsque vous recevez quelque chose via un socket (vous utilisez peut-être select / epoll, etc.), parcourez votre liste et trouvez une correspondance entre le socket et l’adresse.

Le problème épineux est le suivant: comment comparer les adresses? Comparez chaque champ intéressant pour votre protocole (pour le cas courant avec un protocole TCP , je comparerais l’adresse IP et le port).

Une fois la connexion établie, vous souhaiterez “authentifier” l’utilisateur d’une manière ou d’une autre. Si l’authentification réussit, vous pouvez append cette “information” à l’identité dans votre liste de clients connectés.

Pour identifier les clients dans votre environnement, vous devez demander à chaque client d’envoyer une forme d’identification dans le cadre de chaque message.

Autant que je sache, il n’y a pas d’autre moyen fiable, car une nouvelle connexion est établie chaque fois qu’un client veut parler au serveur.

Il n’y a aucun moyen si vous n’avez pas de protocole de niveau supérieur. Une fois le socket fermé, le client est parti.

Si vous avez besoin que le serveur puisse reconnaître un client, la meilleure solution consiste à implémenter un processus d’authentification. Toute autre solution peut s’appuyer sur la connexion effectivement établie (mais cela ne fonctionne pas si la connexion est fermée) ou sur l’adresse IP du client (mais cela ne fonctionne pas s’il y a plusieurs clients avec la même adresse ou si l’adresse change).

Le client peut être authentifié sur le serveur à l’aide d’un nom d’utilisateur et d’un mot de passe. Si le client et le serveur partagent une clé, chaque message échangé par eux pourrait être authentifié avec un signe. De cette façon, le serveur peut identifier l’expéditeur malgré l’adresse IP du paquet reçu.

Je pense que votre pensée est juste.

Le serveur et le client doivent avoir l’identifiant unique l’un pour l’autre si le client peut se connecter plusieurs fois.

Si le client ne peut pas se connecter plusieurs fois, le serveur peut identifier la valeur de retour ‘accept (2)’ de chaque client; Toutefois, dans votre cas, les clients ont besoin de plusieurs connexions. Vous devez donc concevoir votre propre protocole pour identifier chaque client.

Dans mon cas, dans le projet précédent, j’avais créé un UUID avant de connecter le serveur et j’avais utilisé l’UUID comme identifiant du client. Sous Mac OS X ou Linux, vous pouvez inclure le fichier d’en-tête situé dans /usr/include/uuid/uuid.h.

 #include  ... { uuid_t id; uuid_generate(id); ... } 

Ensuite, vous pouvez obtenir la valeur aléatoire de 128 bits dans ‘id’. J’ai utilisé cet UUID en tant qu’identifications de clients. Il peut y avoir un meilleur moyen de déterminer chaque client.