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

Auteur Sujet: [Résolu] Sockets TCP connectées mais envoi/reception impossible  (Lu 2544 fois)

0 Membres et 1 Invité sur ce sujet

Snaxt

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
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.
« Modifié: Juillet 30, 2014, 08:27:56 pm par Snaxt »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Sockets TCP connectées mais envoi/reception impossible
« Réponse #1 le: Juillet 30, 2014, 07:56:12 pm »
Citer
            if(selector.isReady(listener))
            {
                sf::TcpSocket socket;
                m_socketVector.push_back(&socket);
                if (listener.accept(*m_socketVector[readyClients]) != sf::Socket::Done)
                {
                    return false;
                }
Tu stockes dans ton tableau l'adresse d'une socket déclarée localement, et donc détruite dès la prochaine accolade fermante.
Laurent Gomila - SFML developer

Snaxt

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
Re : Sockets TCP connectées mais envoi/reception impossible
« Réponse #2 le: Juillet 30, 2014, 08:27:16 pm »
Merci beaucoup, j'avais pas fait attention à cela. Ca marche niquel en faisant une allocation dynamique.

Scol-Ben

  • Newbie
  • *
  • Messages: 14
    • Voir le profil
Re : [Résolu] Sockets TCP connectées mais envoi/reception impossible
« Réponse #3 le: Août 14, 2014, 09:24:58 pm »
Salut, je me suis permit d'utiliser ton système pour apprendre sur le réseau.

J'ai donc copier/coller ton code et essayé de le modifier pour ne pas avoir l'erreur que tu avais, le problème c'est que j'ai fait une allocation dynamic pour ne pas détruire le socket.

J'ai fait ceci :

vector<TcpSocket> m_socketVector; // La déclaration du tableau est hors du main.

TcpSocket *p_socket = new TcpSocket; // Je crée un pointeur pour faire une allocation dynamic.
m_socketVector.push_back(p_socket); // Ici j'incrémente mon tableau avec la valeur de mon pointeur qui pointe vers l'adresse du socket.
if(listener.accept(m_socketVector[readyClients]) != sf::Socket::Done) // Ici j'ai enlevé le '*' parce-que je ne comprend pas pourquoi il fallait l'adresse de la case mémoire du tableau alors que la valeur c'est l'adresse du socket.
{
    cout << "Aucun client essai de rejoindre le réseau." << endl;
}

Mais lorsque je compile, j'ai pas mal d'erreur par rapport au vector du genre :
Erreur  1       error C2664: 'void std::vector<_Ty>::push_back(sf::TcpSocket &&)' : impossible de convertir le paramètre 1 de 'sf::TcpSocket *' en 'sf::TcpSocket &&'.

J'ai alors modifié ceci :
m_socketVector.push_back(*p_socket);

Et maintenant la seule erreur est celle-ci :
Erreur  1       error C2248: 'sf::NonCopyable::NonCopyable' : impossible d'accéder à private membre déclaré(e) dans la classe 'sf::NonCopyable'.

Donc voilà je voulais savoir, pourquoi dans ton code tu stockes l'adresse du socker. Et aussi savoir pourquoi j'ai cette erreur lorsque je mais dans mon tableau la valeur du socket.

 

anything