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.


Messages - GG_A_SsaSsIbs

Pages: [1]
1
Réseau / Re : Problème dans le système d'écoute côté serveur
« le: Mars 19, 2014, 10:59:45 pm »
Voila, je transmet mon serveur dans un premier zip, il contient les sources, les libs/includes et même le programme compilé si vous êtes sous windows. ( Le projet ainsi que la lib SFML ont été Compilés sous MinGW TDM-GCC 4.8.1 )

Pour démarrer le serveur, il faut ouvrir votre interpréteur de commande et lancer l’exécutable en y ajoutant l'argument "start" -> server-chat.exe start

Une fois le serveur lancé, vous pouvez l’arrêter à tout moment en rentrant l'argument "off" ( sans les guillemets ) toujours dans votre interpréteur de commande.

http://dl.free.fr/getfile.pl?file=/yUpxs4kT

Pour la composition du zip client minimal, c'est la même que celle du serveur. La seule différence est que vous pouvez lancer directement l’exécutable. ( Attention, le client minimal utilises les même chemins de lib/includes que le serveur, faire attention à ça en cas de re-compilation ).

http://dl.free.fr/getfile.pl?file=/e0tc2pzB

Merci. :)

2
Réseau / Re : Problème dans le système d'écoute côté serveur
« le: Mars 19, 2014, 09:44:51 pm »
Merci pour vos réponses. Je prépare un code minimal et j'envois ça. ;)

Pour les remarques, merci, je viens de corriger le code en conséquence même si ça n'a rien changé à mon problème. :)

3
Réseau / Re : Problème dans le système d'écoute côté serveur
« le: Mars 19, 2014, 06:52:25 pm »
Je viens du coup apporter quelque précisions car mon explication ci-dessus est erroné.

J'ai modifié un peu mon code en utilisant les smartPointer et voici :

if(selector.wait(sf::milliseconds(50)))
    {
        std::cout << "entrer dans le selector wait" << std::endl;
        if (selector.isReady(listener))
        {
            std::unique_ptr<sf::TcpSocket> client = make_unique<sf::TcpSocket>();


            if(listener.accept(*client) == sf::Socket::Done)
            {
                ip = client->getRemoteAddress().toString();
                std::cout << "Client IP : " << client->getRemoteAddress() << " connected" << std::endl;
                clientList.emplace_back(std::move(client));
                for(auto& clientCurrentList: clientList)
                {
                    if(clientCurrentList->getRemoteAddress().toString() == ip)
                    {
                        selector.add(*clientCurrentList);
                    }
                }


            }
        }else{
            for(auto& clientCurrentList: clientList)
            {
                if(selector.isReady(*clientCurrentList))
                {
                    if(clientCurrentList->receive(packet) == sf::Socket::Done)
                    {
                        std::cout << "Client IP : " << clientCurrentList->getRemoteAddress() << "send a packet" << std::endl;
                        packet >> message;
                        for(auto& sendClientCurrentList: clientList)
                        {
                            packet << message;
                            sendClientCurrentList->send(packet);
                        }
                    }else if(clientCurrentList->receive(packet) == sf::Socket::Error)
                    {
                        std::cout << "Client IP : " << clientCurrentList->getRemoteAddress() << "error with a packet" << std::endl;
                    }
                }
            }
        }
    }

En réalité mon problème et que je rentre bien dans "selector.wait(sf::milliseconds(50))" lorsque le sélecteur détecte une action venant du listener mais hors mit ce cas de figure, je ne rentre plus jamais dans cette condition.

 Du coup je me demande ou sa pêche puisque avec ce nouveau code, je stock mon nouvel objet TcpSocket() dans mon std::list et dans le sélecteur, je référence le nouvel objet socket :"selector.add(*clientCurrentList)".

Je fais envoyer au client dont la connexion à réussi avec le serveur, un 'sf::packet' contenant une chaine de caractère basique pour tester et pourtant, à chaque bouclage côté serveur, je ne rentre quand même pas dans la condition, comme si le sélecteur avait perdu la trace ou n'avait tout simplement jamais eu la référence aux sockets stockés dans le conteneur et du coup rien n'écoute les dites socket.

Je ne sais pas si j'aurais plus d'aide ou de succès qu'a mon premier post :) mais sa ne coute rien d'essayer. Je continue d'investiguer de mon côté.

Merci par avance.

4
Réseau / Problème dans le système d'écoute côté serveur
« le: Mars 13, 2014, 05:21:55 pm »
Bonjour à tous,

Je réalise à titre d'entrainement un client/serveur basique de type chat. Je rencontre un problème lors de l'écoute et du traitement des données côté serveur, mon programme server toutefois compile bien et ne plante pas mais il ne retourne pas le résultat attendu .

Mon système fonctionne ainsi :

Le serveur stock les clients dont la connexion à réussi dans un conteneur list et à partir de ce conteneur list j'écoute chaque client connecté pour gérer les packets entrant/sortant.

Voici le morceau de code traitant de ceci :

if(selector.wait(sf::milliseconds(100)))
    {
        if (selector.isReady(listener))
        {
            client = new sf::TcpSocket;

            if(listener.accept(*client) == sf::Socket::Done)
            {
                clientList.emplace_back(client);
                for(std::list<std::unique_ptr<sf::TcpSocket>>::iterator it = clientList.begin(); it != clientList.end(); ++it)
                {
                    if(**it == *client)
                     {
                        selector.add(**it);
                     }
                }
                std::cout << "Client IP : " << client->getRemoteAddress() << "connected" << std::endl;

            }else{

                delete client;

            }
        }
        if(!clientList.empty())
        {
            for(auto& clientCurrentList: clientList)
            {
                std::cout << selector.isReady(*clientCurrentList) << std::endl;
                if(selector.isReady(*clientCurrentList))
                {
                    std::cout << "test2" << std::endl;
                    if(clientCurrentList->receive(packet) == sf::Socket::Done)
                    {
                        std::cout << "Client IP : " << clientCurrentList->getRemoteAddress() << "send a packet" << std::endl;
                        packet >> message;
                        for(auto& sendClientCurrentList: clientList)
                        {
                            packet << message;
                            sendClientCurrentList->send(packet);
                        }
                    }else if(clientCurrentList->receive(packet) == sf::Socket::Error)
                    {
                        std::cout << "Client IP : " << clientCurrentList->getRemoteAddress() << "error with a packet" << std::endl;
                    }
                }
            }
        }

    }

Mon problème ce situe dans la seconde partie du code, ici précisément :

if(selector.isReady(*clientCurrentList))
Ma condition est toujours fausse quoi qu'il arrive ce qui fait que mon client plante puisque le packet n'arrive jamais, il faut que j'éteigne le serveur pour débloquer le client.

Si une âme charitable pouvait m'expliquer ce que j'ai fait de travers, je suis preneur. :)

Merci par avance.

5
Général / Re : Erreur pour build sfml 2.1 + sfgui ( cmake )
« le: Février 14, 2014, 10:40:41 pm »
Bon et bien impeccable sa marche et j'ai pu compiler ma lib sans problème.

Merci de ton aide bcvz. ;)

Pour faire un résumé clair afin que sa puisse servir à un autre, pour utiliser sfgui, il faut :

Télécharger les sources : http://sfgui.sfml-dev.de/download/
Faire très attention à la version que vous prenez par exemple à l'heure ou j'écris ce post, il y a :

- Release 0.2.1 (SFML Git)
- Release 0.2.0 (SFML 2.1)

Et sa était la mon erreur, j'ai parcouru très vite la page de téléchargement du site SFGUI alors qu'elle précise bien que si vous prenez la version "release 0.2.1" des sources, il vous faut les sources de SFML Git, sinon pour la 0.2.0, vous pouvez utiliser SFML 2.1

J'ai rencontré par la suite d'autre problème mais ils sont facile à résoudre. Il suffit de bien lire les messages d'erreurs dans CMake ou dans le BuildLog si cela se passe à la compilation. ( Hésitez pas à reprendre ce sujet au cas ou vous buttiez ).

Un bon conseil, relisez bien ce qu'a mit bcvz ici, c'est crucial pour réussir :

Citer
Attention pour le montage de SFGUI / ! \
-Tu dois simplement mettre SFML_ROOT dans un fichier qui contient les libs d'SFML ainsi que les fichiers include
-Linker GLEW au glew qui se trouve dans SFML/extlibs
-CMAKE_MODULE_PATH la où se trouve findSFML (SFML/Cmake/modules)

Encore merci bcvz.

6
Général / Re : Erreur pour build sfml 2.1 + sfgui ( cmake )
« le: Février 14, 2014, 01:56:07 pm »
Bonjour et merci pour cette première réponse.

OKi, moi j'ai téléchargé les sources de la version 2.1 mais enfaîte c'est les sources de la version github qu'il faut.

Je vais testé ça en faisant bien sur un retour sur la situation.

Juste à titre informatif et en résumant, elles ont quoi de différente les sources github et les sources de la version 2.1 ?

Merci encore.

7
Général / Erreur pour build sfml 2.1 + sfgui ( cmake )
« le: Février 13, 2014, 08:08:34 pm »
Bonsoir,

Je souhaiterais pouvoir tester la lib sfgui. Je fais donc un montage avec Cmake comme l'explique le site en liant sfgui à sfml et glew.

Lors de la configuration du montage, je tombe sur cette erreur :

CMake Error at SFML-2.1/cmake/Modules/FindSFML.cmake:199 (message):
  Could NOT find SFML (missing: SFML_GRAPHICS_LIBRARY SFML_WINDOW_LIBRARY
  SFML_SYSTEM_LIBRARY)

Je m'empresse donc de modifier le CmakeLists.txt de sfgui pour y ajouter :

set( GLEW_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/glew-1.10.0/include" )
set( GLEW_LIBRARY "${PROJECT_SOURCE_DIR}/glew-1.10.0/lib" )
find_package( GLEW REQUIRED )
set( CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/SFML-2.1/cmake/Modules" )
set( SFML_ROOT "${PROJECT_SOURCE_DIR}/SFML-2.1" )
find_package( SFML 2 REQUIRED COMPONENTS graphics window system )

J'ai même essayé dans le set SFML_ROOT de mettre le lien absolue en partant de C:\etc...... mais aucun changement.

Je me rends donc dans le findSFML.cmake voir ce qu'il en est. Les commentaires disent de spécifier quel module nous voulons utiliser ( system, window etc .... ).

Ce qui est déjà fournies dans le CmakeFiles de sfgui :

find_package( SFML 2 REQUIRED COMPONENTS graphics window system )
Je me tourne vers vous du coup pour comprendre ce que j'ai zappé dans le processus ou du moins avoir une piste. :)

Merci par avance pour toute aide apportée.

Assa

8
Fenêtrage / Re : Gérer plusieurs fenêtres
« le: Février 03, 2014, 08:32:18 pm »
Bon finalement, j'ai pu bossé sur l'idée et je suis arrivé à quelque chose. :)

Je vais donc proposer un début de solution ici concernant l'ouverture dynamique simple de plusieurs fenêtre SFML.

Une class qui gère le fenêtrage, tout d'abord son prototype pas grand chose à dire :

Attributs :
- Un conteneur vector

Methodes :
- un constructeur par défaut
- la méthode addFrame qui permet d'ajouter dans le conteneur dynamiquement autant de fenêtre que vous le souhaitez une fois la class instanciée.
- la méthode getWindowListSize qui retourne à la boucle principale le nombre de case restant dans le conteneur. ( et donc le nombre de fenêtre encore ouverte ).
- la méthode poolEvent qui s'occupe d'écouter les événements dans chaque fenêtre ouverte en utilisant bien sur les fonctions et méthodes de la SFML pour les gérer. Cette méthode se charge également de supprimer du conteneur la fenêtre dont l'event de fermeture a été appelé en utilisant un itérateur ( principe de l'idiom erase-remove pour gérer correctement l'itérateur ).

#include <string>
#include <vector>
#include <algorithm>
#include "make_unique_ptr_temp.h"
#include <SFML/Graphics.hpp>


class graphic_engine
{
    public:
        graphic_engine();
        void addFrame(unsigned int width, unsigned int height, std::string title);
        int getWindowListSize();
        void poolEvent(const int val, sf::Event& e);
        virtual ~graphic_engine();
    protected:
    private:
        std::vector<std::unique_ptr<sf::RenderWindow>> windowList;

};

et la définition ( je pense que le code parle de lui même mais ne pas hésiter à me demander si besoin de détail ) :

graphic_engine::graphic_engine()
{

}

void graphic_engine::addFrame(unsigned int width, unsigned int height, std::string title)
{
    windowList.push_back(make_unique<sf::RenderWindow>(sf::VideoMode(width, height), title));
}

int graphic_engine::getWindowListSize()
{
    return windowList.size();
}

void graphic_engine::poolEvent(const int val, sf::Event& e)
{
    if(windowList[val]->pollEvent(e))
    {
        if (e.type == sf::Event::Closed)
        {
            windowList[val]->close();
            windowList.erase(std::remove(windowList.begin(), windowList.end(), windowList[val]), windowList.end());
        }
    }
}


graphic_engine::~graphic_engine()
{
    //dtor
}

Et enfin dans le main :

Citer
int main()
{

    graphic_engine* gs = new graphic_engine();
    gs->addFrame(300,200,"fen1");
    gs->addFrame(300,200,"fen2");
    gs->addFrame(300,200,"fen3");

    while (gs->getWindowListSize() != 0)
        {
            for(int i = 0; gs->getWindowListSize() > i; i++)
            {
                sf::Event event;
                gs->poolEvent(i, event);
            }
        }
    return 0;
}

Une fois les fenêtres créées, on démarre la boucle principale qui ne s’arrêtera pas tant qu'il restera des fenêtres dans le conteneur. On ajoute une autre boucle qui aura pour fonction de parcourir toutes les cases du conteneur et d'écouter les events sur chaque fenêtre.

Vous noterez également que les smart pointer ont été sélectionnés, je trouvais très pratique de ne pas avoir à gérer le deleting dans le conteneur avant de supprimer une case. Cependant comme la fonction std::make_unique n'existe pas dans la librairie standard et que je n'utilise pas boost, j'ai récupéré un template proposant l'implémentation de la fonction en attendant la norme c++14 :

http://www.jsfauteux.com/blog/post/2/std::make_unique-dans-le-C++14

basé sur ce rapport :

http://herbsutter.com/gotw/_102/

Je me doute bien qu'on doit pouvoir faire mieux et que pour les pratiquants chevronnés du c++, ce n'était absolument pas difficile à réaliser. Je suis en tout cas ouvert à toute critique constructive pour améliorer le code. :)

En espérant que sa pourra servir à quelqu'un.

Bonne soirée.

9
Fenêtrage / Re : Gérer plusieurs fenêtres
« le: Février 01, 2014, 02:57:35 pm »
Bonjour Laurent, bonjour à tous,

Tout d'abord, toutes mes excuses pour ce déterrage de topic mais les différentes réponses s'y trouvant sont pour moi au cœur de ma question. Si jamais cela ne se fait pas, aucun problème je recréerai un autre topic, suffit de me le signaler.

Laurent, quand tu dis :

Citer
Pourquoi ? Tant que ton propre code ne dit pas de fermer les autres lorsqu'une est fermée, cela ne se produira pas. Je te l'ai dit, la condition qui stoppe la boucle principale, tu y mets ce que tu veux. Si c'est "boucler tant que la fenêtre principale est ouverte" plutôt que "bloquer tant que toutes les fenêtres sont ouvertes", et bien pas de souci, tu peux le faire aussi... C'est ton programme, tu codes ce que tu veux.

et

Citer
Tu peux par exemple utiliser un tableau dynamique (std::vector) de fenêtres, comme je l'ai mentionné précédemment.

Je souhaite moi aussi pouvoir créer plusieurs fenêtre en même temps. Pour faire court, j'ai des class spécifique qui ont besoin de se créer des fenêtres indépendantes de la principale mais qui n'ont pas forcément besoin d'être sur un autre thread.

Dans la phase de développement et pour tester, j'appel le constructeur de ma class qui gère le fenêtrage. ( Cette class contient donc un vector pour ranger dynamiquement mes fenêtres ). Mais je n'arrive pas bien à conceptualisé dans ma tête la suite à comprendre :

Pour la boucle principale, j'ai bien comprit que j'arrête un peu comme et quand je veux par exemple, javais idée dans la condition de ma boucle principale que tant que mon vector n'est pas vide, c'est qu'il y a encore des fenêtres active. ( En gros chaque fois que je ferme une fenêtre je dois aussi l'éliminer dans le vector ). La ou je pêche en revanche, c'est pour réaliser les boucles d'écoutes des events à chaque création dynamique d'une fenêtre. ( ne pas faire une boucle en dur pour chaque fenêtre créée sinon, l’intérêt de la création dynamique est absurde ).

En résumé je ne suis pas bien sur de partir dans la bonne direction ( même avec mon histoire d'éliminer chaque fenêtre dans le vector des leur fermeture ) et je souhaiterais avoir ton avis sur la question voir même si tu as la possibilité de me donner un exemple concret en utilisant un tableau de vector selon l'idée que tu exposes dans tes anciens posts ?

Merci par avance. :)

10
Général / Re : Fenêtre qui n’apparaît pas après la compilation
« le: Décembre 18, 2012, 10:19:10 am »
Oki et bien merci.

Pour tout t'avouer, je ne pensais pas que ma version gcc ne fonctionnerais pas avec la version compiler du site. :)

Cela dit, je pense que dans la doc, tu devrais mettre un exemple entre parenthèse avec mon message d'erreur pourquoi pas ^^. Ca pourrait aiguiller directement les gens qui ont eu le même problème que moi sans qu'il ait à te reposer la même question.

Enfin ce n'est qu'une suggestion à toi de voir. ;)

Merci encore !

11
Général / Re : Fenêtre qui n’apparaît pas après la compilation
« le: Décembre 18, 2012, 10:05:19 am »
Oui bien sur, pour le debugger il me dit :

Program received signal SIGSEGV, Segmentation fault.

In sf::VideoMode::VideoMode (this=0xc8, modeWidth=200, modeHeight=32, modeBitsPerPixel=2) at D:\developpement\sfml-master\src\SFML\Window\VideoMode.cpp:50 ()

Le fichier .cbp est join également à ce post.

Merci par avance.

[attachment deleted by admin]

12
Général / Fenêtre qui n’apparaît pas après la compilation
« le: Décembre 18, 2012, 09:39:05 am »
Bonjour,

Je voulais tester ce matin la librairie SFML et pour ce faire, j'ai suivi scrupuleusement les informations donnés sur la version qui m'intéressait. ( http://www.sfml-dev.org/tutorials/2.0/start-cb-fr.php ).

Je récupère le code à la fin, le compile et run. Lors de la compilation apparemment il n'y aucun problème selon le compilo mais voila, la fenêtre n’apparaît jamais et au bout de 5 à 8 secondes environ, l'IDE me rend la main avec pour message :

Process terminated with status -1073741819 (0 minutes, 7 seconds)

Si quelqu'un pouvait me mettre sur une piste par rapport à ça, je lui en serais bien reconnaissant.

Merci par avance.

Cordialement,

Edit : J'utilise la version static de la librairie.


Pages: [1]