Bonjour,
Je crée tranquillement le nécessaire pour un serveur gérant plusieurs clients. Mais j'ai un souci car le SocketSelector (dans lequel j'ai donc enregistré mon TcpListener), ne répond jamais lorsqu'un client fait un "connect". Le client reçoit bien la comfirmation de la connexion dit en passant !
voici le code concerné :
GLvoid Net_BasicServer::listenConnectTCP_Thread()
{
sf::SocketSelector selector;
selector.add(m_TCPlistener);
m_b_stopThreads = false;
// lie l'écouteur à un port
if (m_TCPlistener.listen(m_portEcoute) != sf::Socket::Done)
{
std::cout<<"port déjà utilisé"<<std::endl;
}
std::cout<<"Début thread écoute TCP Serveur"<<std::endl;
while(!m_b_stopThreads)
{
// socket TCP d'écoute:
if (selector.wait(sf::milliseconds(60)))
{
if (selector.isReady(m_TCPlistener))
{
std::cout<<"test nouveau client"<<std::endl;
sf::TcpSocket* socket=new sf::TcpSocket();
if (m_TCPlistener.accept(*socket) == sf::Socket::Done)
{
std::cout<<"nouveau client connecté"<<std::endl;
m_clients.push_back(new Net_ConnectedClient(socket));
}
}
}
}
std::cout<<"Fin thread écoute TCP Serveur"<<std::endl;
m_TCPlistener.close();
}
Et voici donc les résultats de mes tests :
- avec ce code, si un client se connecte, il reçoit la confirmation de la connexion. Mais coté serveur, il ne passe jamais dans "if (selector.isReady(m_TCPlistener))". Et impossible ensuite de retenter une autre connexion
- testé sans le "if (selector.isReady(m_TCPlistener))", et bien entendu ça ne change rien. Donc en fait c'est qu'il ne parvient jamais à rentrer dans "if (selector.wait(sf::milliseconds(60)))". le selector ne semble pas réagir au connect du client.
- en supprimant le selecteur, tout fonctionne, le TcpListener.accept est pris en compte, d'autres clients peuvent rejoindre.
Voilà, je reste à disposition si il y a besoin d'autres infos. Au pire je peux toujours trouver un moyen de ne pas utiliser de selector, mais je les trouve bien utile pour justement stopper mes threads de façon bien contrôlé (dans ce cas j'ai juste à passé m_b_stopThreads à false dans le thread principal, et ça va me stopper l'écoute après 60 msec max).