Serveur web HTML : indentification unique d'un client

Signaler
Messages postés
149
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
10 décembre 2009
-
Messages postés
149
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
10 décembre 2009
-
Bonjour

Dans le cadre u développement d'un petit serveur HTML propriétaire je cherche à identifier de manière unique chaque client connecté pour gérer des "sessions".
Le but est de demander à chaque nouveau client, de s'identifier et de vérifier, lors de ses requètes ultérieures, si le délai d'expiration de la "session" n'a pas expiré.

En résumé : j'ai juste besoin de savoir comment identifier de manière unique chaque client...

J'utilise actuellement "inet_ntoa" juste après "accept"
"
adresse_ip_client = inet_ntoa( maSocket.sin_addr);
"
ce qui me renvoie l'adresse IP du client connecté.

Mais j'ai un soucis car identifier un client par son adresse IP me paraît insuffisant...

- Ca ne marche pas si le client n'a pas d'adresse fixe. Il risque de ne plus être considéré comme loggué lors de l'attribution d'une nouvelle adresse IP temporaire. (c'est peut-être un faux problème, l'adresse est valide, au moins 24h je crois, ça doit dépendre du fournisseur d'accès)

- Plus grave peut-être : ça ne marchera pas si plusieurs clients d'un même réseau consultent à distance le serveur. N'auront-ils pas dans ce cas la même adresse IP ? Et si oui comment les distinguer les uns les autres ?  Bien sùr les sockets ne s'enmèleront pas les pinceaux mais perso j'ai besoin d'un ID unique par client (un client peut "déclencher" plusieurs sockets pour une seule page web si celle-ci contient des images, des sons etc.)

Si qqun a une idée ou a déjà été confronté à cette question ...
toute info bienvenue

6 réponses

Messages postés
149
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
10 décembre 2009

Rebonjour

je vais essayer de faire plus court

Je suis en train de concevoir un petit serveur web HTML en Multithread.
Je sais déjà envoyer les pages demandées par les clients connectés et récupérer l'adresse IP du client connecté avec "inet_ntoa". En réseau local chacun a une adresse différente.

Par contre sur le Net tous les postes ont la même adresse IP "publique"  : celle attribuée pour 24h par notre fournisseur d'accès à ma boite (On passe tous par le même routeur).

Ma question est : le serveur sera distant...
Comment mon futur serveur peut-il faire la différence entre les différents utilisateurs ?

Il doit bien y avoir un moyen puisque chaque client reçoit bien les réponses de ses propres requêtes et pas celles de son voisin de bureau
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,

ben quand tu recois une requete depuis un socket, tu renvoies la reponse dans ce même socket, ca me semble logique non ?
Messages postés
149
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
10 décembre 2009

Salut

Oui ça je sais, c'est ce que je fais :

le socket listener écoute, un client A se connecte, j'accepte la connexion, nouveau Socket A attribué au client A : il envoie sa requête, je lui répond, on ferme la connexion : tout baigne puisqu'on parle sur le même socket A.

Si dans un autre thread un client B se connecte ont fait la même chose on parle sur un autre socket B.... etc...

Quand un client demande une page html qui contient un logo, le client ouvre 2 sockets : 1 pour la page, 1 pour l'image, traités simultanément dans 2 threads séparés puis les sockets sont détruits, la connexion fermée.

Imagine : j'ai une page login.html qui me poste des données (en POST ou GET peu importe). Chaque fois qu'un client se loggue je veux mémoriser un ID qui lui est propre... Si un utilisateur se connecte et n'a pas d'ID perso je l'envoi sur le page login.html

C'est ce que je fais en php avec une variable de session...

Comment puis-je faire pour stocker un ID unique pour le client A et un autre pour le client B etc... qui se connectent au serveur distant s'ils utilisent le même routeur (même adresse IP) ? Je ne peux pas utiliser leur adresse IP (ils ont tous la même, celle du routeur)

C'est ça ma question en fait ! (je dois pas être trés clair le week end est proche)
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,

Justement, tu n'a pas a faire cette difference puisque c'est au niveau php que tu dois gerer les sessions.

En HTTP (et non html, au passage) un client est representé par son
socket et c'est tout. Si tu as deux socket, c'est que tu as deux
client, c'est tout ce qui t'interesse (peu importe si ces deux client
sont en fait la même machine ou pas, ou deux machines differentes
derriere dans le même reseau...).
Messages postés
149
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
10 décembre 2009

Bonjour

Serveur HTTP bien sûr, ma langue a fourché (ou plutôt mes doigts). A force de se répéter on finit par se gourer

J'ai déjà précisé dans mon premier message, et rappelé dans les suivants, qu'on m'a demandé d'écrire de toute pièce un serveur Web HTTP gérant des pages statiques un serveur "maison"

Il n'hébergera que des pages HTML.
Donc pas de PHP (ce qui m'obligerait en outre à inclure un module PHP dans mon serveur ce que le client ne veut pas, sinon autant utiliser Apache/Php/Mysql, le triplet gagnant, ce que le chef de projet se refuse à faire, ne me demandez pas pourquoi... La maquette du projet final a d'ailleurs été réalisée en php/mysql par mes soins, faire et défaire c'est toujours travailler).

En gros mon problème : je veux savoir comment pouvoir gérer des cookies serveurs ou variables de session (ce que tout le monde sait faire en php) mais en C++ dans un serveur HTTP multithread écrit à la mimine. Donc pouvoir associer une ou plusieurs variables à chacun des clients connectés au moins une fois.

Le serveur est écrit et stable, manque juste la gestion de cookies serveur avec un temps d'expiration pour obliger les clients connectés à se reloggueur périodiquement
...

"En HTTP (et non html, au passage) un client est representé par son
socket et c'est tout. Si tu as deux socket, c'est que tu as deux
client, c'est tout ce qui t'interesse (peu importe si ces deux client
sont en fait la même machine ou pas, ou deux machines differentes
derriere dans le même reseau...)."

et là où je coince c'est que lorsque un client demande une page contenant n liens il peut, s'il s'agit de gros fichiers, utiliser jusqu'à n+1 sockets, traités simultanément et que ces sockets sont refermés et donc perdus dès que le fichier est reçu... Donc il ne me reste que l'adresse IP pour voir, lors d'une autre requête, s'il s'agit d'un client déjà traité... Personne n'a mieux à proposer ?
Messages postés
149
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
10 décembre 2009

Bon ben... une idée peut-être alors...

Est-ce qu'un solution ne serait pas tout simplement que le serveur envoie des cookies stockés directement chez chaque client ?

un truc du genre :

"Set-Cookie: Cookie1=123; domain=; expires="Mon, 22 Oct 2007 14:00:00 +0000"

envoyé dans l'entête HTTP

Lors du passage sur la page "login.html" l'utilisateur envoit son login et son mot de passe. Le formulaire renvoit sur une page "traite_login.html" par exemple; si l'utilisateur s'est identifié avec succès cette page créé alors un cookie spécifique au client avec une date d'expiration...
Si le cookie n'existe pas on envoit sur la page login.html directement...

La méthode est bonne ?