Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Sujets - Archimed78

Pages: [1]
1
Réseau / Connect TcpSocket
« le: Septembre 10, 2016, 07:22:32 pm »
Bonjour,
merci par avance de votre aide.
J'ai un petit projet de jeu en réseau mais j'ai quelque difficulté pour dans la communication client/serveur.
J'aimerai réussir a faire le code le plus propre possible mais je n'arrive pas a me connecter proprement : c'est à dire que quand je fais mon connect sur le TcpSocket vers mon serveur, sur le serveur je vois bien que je suis connecté mais par contre coté client mon socket garde toujours le status "NotReady".
Il y a surement un concept que j'ai mal compris...

Je vous fournis les codes simplifié :

ManagerNetwork.cpp (coté client)
#include "ManagerNetwork.h"

#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 7777

ManagerNetwork::ManagerNetwork() : Manager()
{
        std::cout << "Initialisation du ManagerNetwork" << std::endl;
        m_socket = new sf::TcpSocket();
        m_socket->setBlocking(false);
        tryConnect();
}


ManagerNetwork::~ManagerNetwork()
{
        std::cout << "Destruction du ManagerNetwork" << std::endl;
}

void ManagerNetwork::tryConnect()
{
        m_socket->disconnect();
        std::cout << "Tentative de connexion :" << SERVER_IP << ":" << SERVER_PORT << std::endl;
        sf::Socket::Status status_connect = m_socket->connect(sf::IpAddress(SERVER_IP), SERVER_PORT);

        bool quit = false;
        while (quit == false)
        {
                switch (status_connect)
                {
                case sf::Socket::Done:
                {
                        std::cout << "Connexion OK" << std::endl;
                        quit = true;
                }
                break;

                case sf::Socket::NotReady:
                        std::cout << "Not ready" << std::endl;
                        break;

                default:
                        std::cout << "Echec connect" << std::endl;
                        break;
                }
        }
}
 

main.cpp (coté serveur)
#include <iostream>
#include <SFML\Network.hpp>
#include <stdlib.h>

#define NETWORK_PORT 7777

int main()
{
        sf::TcpListener listener;
        listener.listen(NETWORK_PORT);

        sf::SocketSelector selector;
        selector.add(listener);

        std::vector<sf::Socket*> sockets;

        sockets.push_back(&listener);

        std::cout << "Lancement de l'ecoute serveur sur le port " << listener.getLocalPort() << std::endl;

        bool exit = false;
        while (exit == false)
        {
                if (selector.wait(sf::seconds(1)))
                {
                        for (unsigned int i = 0; i < sockets.size(); i++)
                        {
                                if (selector.isReady(*sockets.at(i)))
                                {
                                        if (sockets.at(i) == &listener)
                                        {
                                                sf::TcpSocket *client = new sf::TcpSocket();
                                                if (listener.accept(*client) == sf::Socket::Done)
                                                {
                                                        std::cout << "Nouvelle connexion client (" << client->getRemoteAddress().toString() << ")" << std::endl;
                                                        sockets.push_back(client);
                                                        selector.add(*client);
                                                }
                                                else
                                                {
                                                        std::cout << "Problème de connexion d'un client (" << client->getRemoteAddress().toString() << ")" << std::endl;
                                                }

                                        }
                                        else
                                        {
                                                sf::Packet packet;
                                                sf::TcpSocket* socket = static_cast<sf::TcpSocket*>(sockets.at(i));
                                                switch (socket->receive(packet))
                                                {
                                                        case sf::Socket::Done:
                                                                std::cout << "Recu packet : " << packet.getDataSize() << std::endl;
                                                                break;

                                                        case sf::Socket::Error:
                                                                std::cout << "Error" << std::endl;
                                                                break;

                                                        case sf::Socket::Disconnected:
                                                                std::cout << "Disconnected" << std::endl;
                                                                selector.remove(*socket);
                                                                delete socket;
                                                                break;
                                                }
                                        }
                                }
                        }
                }
        }
}

j'espère que vous pourrez m'aider.
Merci

2
Graphique / [SFML2] Problème chargement de texture
« le: Janvier 31, 2013, 10:33:11 am »
Bonjour,

J'ai une petit soucis au niveau du chargement d'une texture, lorsque je fais :
loadFromFile("leChemin.png");

Dans tout mon projet tout va bien, mais lorsque ce que j’essaie de charger une texture de 1280x3136 on me renvoi cette erreur dans la console :


A priori je sais lire, je me dit que il n'est pas possible de charger une texture d'une taille aussi grande, mais premièrement ce soucis arrive uniquement sur le PC de mon travail (carte graphique intégré Intel, je suppose que le problème viens de la... alors que sur mon PC de domicile, aucun problème (nVidia)) et deuxièmement en aucun cas, je n’essaie de charger une texture de 2048x4092 comme le message l'indique.

Voila, je vous remercie d'avance pour votre aide.

Cordialement.

3
Graphique / [SFML2] Optimisation déplacement
« le: Octobre 30, 2012, 05:01:33 pm »
Bonjour a tous, merci d'avance pour la/les futurs réponses que vous pourriez m'apporter.

J'ai un problème lors du déplacement de plusieurs sprites a la suite.
J'ai une map de 20*20 cases (sa peu varier) avec des sprites de 32px. Mais cette map est constitué de 3 couches successive. J'ai donc 20*20+20*20+20*20 = 1200 sprites afficher. En réalité les couches 2 et 3 ne sont pas pleine donc sa fais relativement moins. Mais théoriquement on pourrais allé a 1200 sprites max.

Lors de l'affichage aucun soucis, mais lors du déplacement (move de sf::Sprite) de chaque sprite pour faire déplacer la map, la il y a une sacré chute du FPS.

Ma question est donc la suivante : Existe t'il un moyen de déplacement toute la map sans attiré les foudres du FPS ? Existe t'il un conteneur permettant de déplacement tout ce petit monde et donc évité 1200 tour de boucles ?

Je vous remercie énormément.

Cordialement.

4
Graphique / [Résolu][SFML2] Problème affichage sf::Text
« le: Septembre 10, 2012, 03:52:43 pm »
Bonjour a tous,

J'ai un soucis d'affichage de sf::Text, en faite lors de l'affichage il n'y a que certaine lettre qui s'affiche et pas d'autre, mais ce ne sont pas des caractères spéciaux.

Vu que je suis entrain de créer une usine a gaz, il va être très dur pour moi de vous faire un code minimale pour reproduire se bug, alors je ne demande pas une solution, mais juste une piste de recherche.

Voici la fonction qui met le texte :
void CreeChar::afficherErreur(std::string msg)
{
    std::cout << "TEST ERREUR = " << msg << std::endl;
    m_text_erreur->setString(msg);
    m_text_erreur->setPosition(10, 10);
    std::cout << "TEST ERREUR 2 = " << m_text_erreur->getString().toAnsiString() << std::endl;
}

et la fonction de dessin :
void CreeChar::dessiner()
{
    if (m_text_erreur != NULL) m_fenetre->draw(*m_text_erreur);
}

Et donc a savoir que m_text_erreur est une attribut de la classe et qu'il est initialisé dans le constructeur.

Voici le resultat graphique :


J'ai donc tester si mes valeur étai bonne dans la console et aucun soucis :


Merci beaucoup du temps que vous m'accorder.

5
Réseau / [SFML2] Organisation / logique et erreur
« le: Juillet 10, 2012, 03:24:22 pm »
Bonjour a tous,

J'ai un soucis de logique et d'organisation de mon code.
Il est difficile d'expliqué le problème, je vais donc vous montrer le code et expliqué mon soucis par la suite.

Il s'agit d'un simple serveur/client standard. Hors pour un certaine organisation du code j'ai décidé de mettre un Thread par écoute client. On retrouve donc deux classe : Gestionnaire et Client.

La classe Gestionnaire qui gèrent tout les clients et la classe Client gére le Thread d’écoute.

Gestionnaire.cpp
#include "Gestionnaire.h"

Gestionnaire::Gestionnaire()
{
    std::cout << "Instance Gestionnaire - OK" << std::endl;
    sf::TcpListener ecoute;
    ecoute.listen(PORT_ECOUTE);
    std::cout << "Lancement ecoute : port " << PORT_ECOUTE << std::endl;
    while (true)
    {
        sf::TcpSocket *client = new sf::TcpSocket();
        std::cout << "Attente de connexion " << std::endl;
        if (ecoute.accept(*client) == sf::Socket::Done)
        {
            std::cout << "Tentative connexion (" << client->getRemoteAddress() << ")" << std::endl;
            m_mutexGlobale.lock();
            m_listeClients.push_back(new Client(this, client));
            m_mutexGlobale.unlock();
            std::cout << "Connexion de " << client->getRemoteAddress() << "- OK" << std::endl;
        }
    }
}

Gestionnaire::~Gestionnaire()
{
    for (unsigned int i = 0; i < m_listeClients.size(); i++)
    {
        std::cout << "Liberation Client (" << m_listeClients[i] << ")" << std::endl;
        delete m_listeClients[i];
    }
    std::cout << "Liberation Gestionnaire - OK" << std::endl;
}
 

Client.cpp
Client::Client(Gestionnaire *gestionnaire, sf::TcpSocket *socket)
{
    m_gestionnaire = gestionnaire;
    m_socket = socket;
    m_threadEnCour = true;
    m_threadSocket = new sf::Thread(&Client::debuterEcoute, this);
    std::cout << "Instance Client - OK" << std::endl;
    m_threadSocket->launch();
}

Client::~Client()
{
    delete m_threadSocket;
    delete m_socket;
}

void Client::debuterEcoute()
{
    std::cout << "Lancement d\'ecoute (" << m_socket->getRemoteAddress() << ")" << std::endl;
    while (m_threadEnCour)
    {
        sf::Packet packetReception;
        sf::TcpSocket::Status status = m_socket->receive(packetReception);

        if (status == sf::TcpSocket::Disconnected)
        {
            m_threadEnCour = false;
            std::cout << "Deconnexion Client (" << m_socket->getRemoteAddress() << ")" << std::endl;
        }
        else if (status == sf::TcpSocket::Error)
        {
            m_threadEnCour = false;
            std::cout << "Erreur : Paquet erreur (" << m_socket->getRemoteAddress() << ")" << std::endl;
        }
        else if (status == sf::TcpSocket::Done)
        {
            std::cout << "Reception paquet - OK (" << m_socket->getRemoteAddress() << ")" << std::endl;
        }
    }
    std::cout << "Fin d\'ecoute (" << m_socket->getRemoteAddress() << ")" << std::endl;

    // ici, code susceptible de devoir désalloué la classe client et supprimer le pointeur dans la classe Gestionnaire.

}
 

Mon soucis est le suivant : je souhaite que lorsque mon Thread soit terminé, donc en gros que le client c'est déconnecté ou qu'il y a eu une erreur, que le Thread demande a la classe Gestionnaire de non seulement désalloué la mémoire de l'instance de Client mais aussi de supprimer le pointeur dans le vector.

Hors problème, car si a la fin de mon Thread je demande a la classe Gestionnaire de supprimer Client (du style m_gestionnaire->supprClient(this); ), étant donné que c'est le Thread qui la appelé, le Thread sera donc toujours en fonction et donc provoque une erreur lors de sa destruction.

J’espère avoir été le plus claire possible, ma question est donc la suivante : peut-on demander a un Thread de d'auto détruire la classe qui le contient, si oui comment ?

En cas de question ou de non compréhension j'essayerai de mieux reformulé

Merci beaucoup de votre aide.

Pages: [1]
anything