1
Réseau / Signal socket disconnected ?
« le: Mai 20, 2012, 11:27:03 am »
Bonjour à tous.
J'ai quelques problèmes avec le module réseau de la SFML.
Aujourd'hui, voici le code serveur simplifié utilisé :
Voici mes questions : Comment faire, sans envoyer d'informations régulières pour vérifié si le client est toujours connecté ? (Si je dois envoyer des informations régulière, je dois multithreadé mon programme client, chose faisable, mais en dernier recours).
En gros ce que je voudrais pouvoir faire :
itération sur tous les sockets dans le selector
-si le socket n'a rien reçu de nouveau, on passe au prochain
-si le socket est déconnecté, je traite cette information
-si le socket a reçu quelque chose de nouveau :
-si c'est le listener, je rajoute la nouvelle connexion et je traite l'information.
-sinon, je traite l'information reçue.
Comment faire ceci facilement avec le module réseau de la sfml ? Dois-je me tourner vers une autre bibliothèque réseau ?
[EDIT] Il semblerait (d'après ce que je viens de lire sur le forum anglais) que je sois obligé de multithreadé mon programme client et de vérifier régulièrement s'il est toujours connecté. Serait-il possible de mettre une fonction GetStatus dans sf::Socket qui nous indique s'il est déconnecté ou non ? (cela est peut-être déjà fait dans SFML2).[/EDIT]
Y a t-il une autre bibliothèque réseau qui pourrait répondre à mes besoins beaucoup plus simplement ?
Merci à tous.
J'ai quelques problèmes avec le module réseau de la SFML.
Aujourd'hui, voici le code serveur simplifié utilisé :
while(!finished)
{
unsigned NbSockets=Selector.Wait();
for (unsigned i = 0; i < NbSockets; ++i)
{
sf::SocketTCP Socket = Selector.GetSocketReady(i);
if(Socket==Listener)
{
sf::IPAddress Address;
sf::SocketTCP Client;
Listener.Accept(Client,&Address);
Selector.Add(Client);
//Envoie des données au client
}
else
{
sf::Packet info;
if(Socket.Receive(info)!=sf::Socket::Done) //On vérifie que le socket a bien reçu quelque chose.
break;
//On traite
}
}
sf::Sleep(0.1);
}
{
unsigned NbSockets=Selector.Wait();
for (unsigned i = 0; i < NbSockets; ++i)
{
sf::SocketTCP Socket = Selector.GetSocketReady(i);
if(Socket==Listener)
{
sf::IPAddress Address;
sf::SocketTCP Client;
Listener.Accept(Client,&Address);
Selector.Add(Client);
//Envoie des données au client
}
else
{
sf::Packet info;
if(Socket.Receive(info)!=sf::Socket::Done) //On vérifie que le socket a bien reçu quelque chose.
break;
//On traite
}
}
sf::Sleep(0.1);
}
Voici mes questions : Comment faire, sans envoyer d'informations régulières pour vérifié si le client est toujours connecté ? (Si je dois envoyer des informations régulière, je dois multithreadé mon programme client, chose faisable, mais en dernier recours).
En gros ce que je voudrais pouvoir faire :
itération sur tous les sockets dans le selector
-si le socket n'a rien reçu de nouveau, on passe au prochain
-si le socket est déconnecté, je traite cette information
-si le socket a reçu quelque chose de nouveau :
-si c'est le listener, je rajoute la nouvelle connexion et je traite l'information.
-sinon, je traite l'information reçue.
Comment faire ceci facilement avec le module réseau de la sfml ? Dois-je me tourner vers une autre bibliothèque réseau ?
[EDIT] Il semblerait (d'après ce que je viens de lire sur le forum anglais) que je sois obligé de multithreadé mon programme client et de vérifier régulièrement s'il est toujours connecté. Serait-il possible de mettre une fonction GetStatus dans sf::Socket qui nous indique s'il est déconnecté ou non ? (cela est peut-être déjà fait dans SFML2).[/EDIT]
Y a t-il une autre bibliothèque réseau qui pourrait répondre à mes besoins beaucoup plus simplement ?
Merci à tous.