-
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 :)
-
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.
-
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.
-
Il faut stocker l'adresse plus "durablement", par exemple dans un conteneur qui associe l'adresse à la socket (std::map).
-
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...
-
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.
-
Effectivement, erreur toute bête ^^
Merci de m'avoir aidé :)