Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Récupérer l'ip d'un client dans un selector.  (Lu 3485 fois)

0 Membres et 2 Invités sur ce sujet

JulienEragon

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Récupérer l'ip d'un client dans un selector.
« le: Juin 03, 2012, 09:19:13 pm »
Bonjour  :)

Je souhaite avoir l'ip du client connecté lorsque j'utilise un SelectorTCP. Voici le code, tout simple :

while (true)
{
       unsigned int NbSockets = Selector.Wait();

        for (unsigned int i = 0; i < NbSockets; ++i) {

                SocketTCPPerso Socket = Selector.GetSocketReady(i);

                sf::IPAddress Address;
                if (Socket == Listener) {

                        sf::SocketTCP Client;
                        Listener.Accept(Client, &Address);
                        std::cout << "Server " << Address << " connected." << std::endl; // affiche la bonne IP

                        Selector.Add(Client);
                }
                else {
                        sf::Packet Packet;
                        if (Socket.Receive(Packet) == sf::Socket::Done) {

                                std::string operation;
                                Packet >> operation;

                                std::cout << "ip : " << Address << std::endl; // affiche 255.255.255.255

                        }
                        else {
                                Selector.Remove(Socket.socketTCP);
                        }
                }
        }
}

Comme vous pouvez le voir, je veux avoir l'ip du client là où on reçoit et traite le Packet. Ce que je ne comprend pas c'est que l'ip affichée est la bonne un peu plus haut, mais pas à l'endroit où je veux.

Comment faire ?

Merci d'avance  :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Récupérer l'ip d'un client dans un selector.
« Réponse #1 le: Juin 03, 2012, 10:20:29 pm »
Au moment où tu affiches Address, elle n'a pas du tout été initialisée, le code qui s'exécute alors n'a rien à voir avec celui qui affiche la bonne adresse.

Il faut donc que tu la stockes pour la resortir au moment adéquat. Sinon, utilise SFML 2.
Laurent Gomila - SFML developer

JulienEragon

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Récupérer l'ip d'un client dans un selector.
« Réponse #2 le: Juin 03, 2012, 10:25:48 pm »
Tu veux dire quelque chose comme ça ?

while (true)
{
       unsigned int NbSockets = Selector.Wait();

        for (unsigned int i = 0; i < NbSockets; ++i) {

                SocketTCPPerso Socket = Selector.GetSocketReady(i);

                sf::IPAddress Address;
                sf::IPAddress ipClient;
                if (Socket == Listener) {

                        sf::SocketTCP Client;
                        Listener.Accept(Client, &Address);
                        std::cout << "Server " << Address << " connected." << std::endl; // affiche la bonne IP
                        ipClient = Address;

                        Selector.Add(Client);
                }
                else {
                        sf::Packet Packet;
                        if (Socket.Receive(Packet) == sf::Socket::Done) {

                                std::string operation;
                                Packet >> operation;

                                std::cout << "ip : " << ipClient << std::endl; // affiche 255.255.255.255

                        }
                        else {
                                Selector.Remove(Socket.socketTCP);
                        }
                }
        }
}

J'ai déjà essayé ça ne marche pas plus =/

Pour ce qui est d'utiliser SFML 2, ça ne va pas être possible ^^ Je suis presque au bout de mon projet et vu le temps qu'il me reste pour le finir, je ne peux pas tout reprendre.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Récupérer l'ip d'un client dans un selector.
« Réponse #3 le: Juin 04, 2012, 08:22:53 am »
Il faut stocker l'adresse plus "durablement", par exemple dans un conteneur qui associe l'adresse à la socket (std::map).
Laurent Gomila - SFML developer

JulienEragon

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Récupérer l'ip d'un client dans un selector.
« Réponse #4 le: Juin 04, 2012, 02:30:59 pm »
J'ai toujours pas résolu mon problème =/ Je vois pas comment utiliser la map. J'ai essayé quelque chose comme ça :

while (true)
{
        unsigned int NbSockets = Selector.Wait();
   
        std::map<sf::SocketTCP, sf::IPAddress> Sockets;

        for (unsigned int i = 0; i < NbSockets; ++i) {

                SocketTCPPerso Socket = Selector.GetSocketReady(i);

                sf::IPAddress Address;
                if (Socket == Listener) {

                        sf::SocketTCP Client;
                        Listener.Accept(Client, &Address);
                        std::cout << "Server " << Address << " connected." << std::endl; // affiche la bonne IP
                        Sockets[Client] = Address;

                        Selector.Add(Client);
                }
                else {
                        sf::Packet Packet;
                        if (Socket.Receive(Packet) == sf::Socket::Done) {

                                std::string operation;
                                Packet >> operation;

                                std::cout << "nb ips : " << Sockets.size() << std::endl; // affiche 0
                               
                                std::string ipAddress = Sockets.find(Socket)->second.ToString();
                               
                                std::cout << "ip : " << ipAddress << std::endl; // affiche 0.0.0.0

                        }
                        else {
                                Selector.Remove(Socket.socketTCP);
                        }
                }
        }
}

Le soucis est que la map est vide à l'endroit où je veux avoir l'ip...

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Récupérer l'ip d'un client dans un selector.
« Réponse #5 le: Juin 04, 2012, 02:37:34 pm »
C'est normal, là tu as un nouveau conteneur à chaque tour de boucle. Il faut le déclarer en dehors de la boucle, de sorte que son contenu reste en place entre deux tours de boucle.
Laurent Gomila - SFML developer

JulienEragon

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Récupérer l'ip d'un client dans un selector.
« Réponse #6 le: Juin 04, 2012, 02:51:22 pm »
Effectivement, erreur toute bête ^^

Merci de m'avoir aidé  :)