Bonjour,
Je suis en train de réaliser un jeu qui doit interagir avec un serveur et je bloque sur un problème: je réussi à connecter mes sockets, mais après impossible d'envoyer/recevoir des packets. J'ai tenté de regarder sur le net et sur le forum des exemples de codes et j'ai pourtant l'impression de faire les choses, à ma manière, mais correctement. J'ai peut-être mal compris quelque chose car c'est la première fois que je fais du réseau.
Côté serveur, j'appelle respectivement les fonction connectPlayers() et initialize() et test à chaque fois la réussite et affiche un message pour voir où ça plante (J'affiche même un message avec l'ip du client et ce dernier s'affiche), la première ce passe très bien et la seconde me renvoie false et donc un message d'erreur.
bool GameNetwork::connectPlayers()
{
sf::TcpListener listener;
if (listener.listen(12345) != sf::Socket::Done)
{
return false;
}
else
cout << "Connection successfull to port 12345" << endl << "Waiting for connections..." << endl;
sf::SocketSelector selector;
selector.add(listener);
int readyClients(0);
sf::IpAddress clientAdress;
while(readyClients < 1) //Ici 10 clients se connecteront, mais je teste avec la valeur 1
{
if(selector.wait())
{
if(selector.isReady(listener))
{
sf::TcpSocket socket;
m_socketVector.push_back(&socket);
if (listener.accept(*m_socketVector[readyClients]) != sf::Socket::Done)
{
return false;
}
clientAdress = m_socketVector[readyClients]->getRemoteAddress();
m_playerIp.push_back(clientAdress.toString());
cout << "Connection received from client " << m_playerIp[readyClients] << endl;
readyClients++;
}
}
}
return true;
}
bool GameNetwork::initialize()
{
sf::Packet packet;
//Envoi à chaque joueur de leur numéro
for(unsigned int i = 0; i < 1; i++)
{
if(packet << i)
{
if(m_socketVector[i]->send(packet) == sf::Socket::Done)
{
packet.clear();
cout << "Player" + i << " (" + m_playerIp[i] + ") received his number." << endl;
}
else
return false;
}
else
return false;
}
return true;
}
Côté client, je me connecte au serveur grâce à "connectToServer()", si ça ne fonctionne pas, je ferme le programme et il ne se ferme pas lorsqu'il n'y a pas d'appel à la fonction de réception/envoi. Je tente ensuite d'obtenir le numéro du joueur grâce à ma deuxième fonction et ferme le programme si ça plante, évidemment le programme se ferme.
bool NetworkEngine::connectToServer()
{
sf::Socket::Status status = m_socket.connect("localhost", 12345);
if (status != sf::Socket::Done)
{
// erreur...
return false;
}
return true;
}
int NetworkEngine::getNumber()
{
sf::Packet packet;
if(m_socket.receive(packet) == sf::Socket::Done)
{
int number(0);
packet >> number;
return number;
}
else
return -1;
}
Je vous remercie d'avance de vote future aide.