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 - roket

Pages: [1] 2 Suivante »
1
Réseau / Re : Segfault TcpSocket.receive (mac)
« le: Novembre 24, 2015, 10:32:10 pm »
Merci!!!

2
Réseau / Re : Segfault TcpSocket.receive (mac)
« le: Novembre 24, 2015, 05:29:25 pm »
Yes! merci!

main.cpp
#include <string>
#include <vector>
#include <thread>
#include <iostream>
#include <atomic>
#include <map>
#include <array>
#include <utility>
#include <SFML/Network.hpp>


typedef struct NetPackage NetPackage;
struct NetPackage
{
        std::string message;
};

typedef struct Client Client;
struct Client
{
    bool                    status;
    std::string     ipAddress;
    unsigned int    port;
    unsigned int        id;
    sf::TcpSocket       *socket;
};

class Server
{
    public:
       
        Server(const std::string &p_ipAddress, const unsigned int &p_port);
        ~Server();

        void launch();
       
        void disconnectClient(const unsigned int &p_id, const bool &p_notErase = true);

        void send(const NetPackage &p_package, const unsigned int &p_clientId);
        void sendAll(const NetPackage &p_package);
               
        private:
        void connectClient();
        void disconnectClients();
        void listenClients(unsigned int p_id);
        void parseMessage(const unsigned int &p_id, const std::string &p_message);

                std::string                             m_ipAddress;
                unsigned int                            m_port;

        std::map<unsigned int, Client>          m_clients;
        sf::TcpListener                         m_listener;

        std::thread*                            m_connectThread;
        std::map<unsigned int, std::thread*>    m_listenClientsThreads;

        std::atomic<bool>                       m_waitForClients;
        std::atomic<bool>                       m_listen;    
       
        unsigned int                            m_lastId;
       
};


Server::Server(const std::string &p_ipAddress, const unsigned int &p_port)
{
    m_ipAddress = p_ipAddress;
    m_port      = p_port;
    m_lastId    = 0;
}

void Server::launch()
{    
    if (m_listener.listen(m_port) != sf::Socket::Done)
    {
        std::cout << "Can't bind the socket" << std::endl;
    }
    m_waitForClients = true;
    m_listen = true;
    m_connectThread = new std::thread(&Server::connectClient, this);
   
}

void Server::send(const NetPackage &p_package, const unsigned int &p_clientId)
{
    char* data;
    data = (char*)p_package.message.c_str();
    m_clients[p_clientId].socket->send(data, p_package.message.size());
}

void Server::sendAll(const NetPackage &p_package)
{        
    for (std::pair<unsigned int, Client> client : m_clients)
    {
        send(p_package, client.first);
    }
}

void Server::parseMessage(const unsigned int &p_id, const std::string &p_message)
{
    // Accpet the client
    if (m_clients[p_id].status == false)
    {
        NetPackage np;
        // Message has to be like : name#type
        // Get the type
        std::string tmpMessage = p_message.substr(p_message.find("#") + 1);
        unsigned int playerType = stoi(tmpMessage);
       
        np.message = "200";
        send(np, p_id);    
    }
}

void Server::listenClients(unsigned int p_id)
{
    sf::TcpSocket *client = m_clients[p_id].socket;
   
    char data[256];
    size_t received = 0;
    std::string message("");
    while(m_listen)
    {
        sf::Socket::Status status;
        if ((status = client->receive(data, 256, received)) != sf::Socket::Done)
        {
            if (m_clients.find(p_id) != m_clients.end())
            {
                if (sf::Socket::Disconnected == status)
                {
                    m_clients[p_id].status = false;
                    disconnectClient(p_id);              
                }
            }
            std::cout << "Can't receive from client with IP " + m_clients[p_id].ipAddress << std::endl;  
        }
        std::string strData = std::string(data);
        if (strData.substr(strData.size() - 3) == "100")
        {
            message += strData.substr(0, strData.size() - 3);
            parseMessage(p_id, message);
        }
        else if (received == 3 && strData == "201")
        {
            m_clients[p_id].status = false;
            disconnectClient(p_id);
            return;
        }
        else
            message += std::string(data);
    }
}

void Server::connectClient()
{
    NetPackage package;
    package.message = "202";
   
    while(m_waitForClients)
    {
        sf::TcpSocket* client = new sf::TcpSocket();
       
        if (m_listener.accept(*client) != sf::Socket::Done)
        {
            delete client;
        }
        else
        {
           
            sendAll(package);

            std::thread *m_listenClientsThread  = new std::thread(&Server::listenClients, this, m_lastId);
            m_listenClientsThreads[m_lastId] = m_listenClientsThread;

            Client clientStruct;
            clientStruct.status = false;
            clientStruct.ipAddress = client->getRemoteAddress().toString();
            clientStruct.port = client->getRemotePort();
            clientStruct.id = m_lastId;
            clientStruct.socket = client;
           
            m_clients[m_lastId] = clientStruct;
           
            package.message = "200";
            send(package, m_lastId);
            package.message = "202";
           
            m_lastId++;
           
        }
    }
}

void Server::disconnectClient(const unsigned int &p_id, const bool &p_erase /* = true */)
{
    if (m_clients[p_id].status)
    {
        NetPackage package;
        package.message = "201";
       
        send(package, p_id);
    }
   
    m_clients[p_id].socket->disconnect();    
    m_listenClientsThreads[p_id]->detach();
   
    delete m_listenClientsThreads[p_id];
    delete m_clients[p_id].socket;
   
    m_listenClientsThreads.erase(p_id);

    if (p_erase)
        m_clients.erase(p_id);
}


void Server::disconnectClients()
{
    for (std::pair<unsigned int, Client>  client : m_clients)
    {
        disconnectClient(client.first, false);
    }
    m_clients.clear();
}

Server::~Server()
{
    disconnectClients();  
   
    m_listen = false;        
    m_waitForClients = false;
   
    m_listener.close();
    m_connectThread->detach();  
   
    delete m_connectThread;
}


int main()
{
        std::string ip = "127.0.0.1";
        int port = 50009;

        Server *server;
        server = new Server(ip, port);
        server->launch();


        sf::TcpSocket   socket;
        socket.connect(ip, port);

        char data[256];
        size_t received;

        socket.receive(data, 256, received);

        delete server;


}
 


Ce code segfault (ligne socket.receive du main) sous mac yosemite..
merci d'avance!!!

3
Réseau / Segfault TcpSocket.receive (mac)
« le: Novembre 23, 2015, 06:03:22 pm »
Bonsoir !
Je rencontre un problème de segfault très étrange sous mac avec l méthode receive de TcpSocket.
Elle segfault :
char data[256];
size_t received;
m_socket.receive(data, 256, received)

lldb indique :

Process 1479 stopped
* thread #2: tid = 0x750c, 0x000000010010e974 libsfml-network.2.3.dylib`sf::Socket::getHandle() const + 4, stop reason = EXC_BAD_ACCESS (code=1, address=0xc)
    frame #0: 0x000000010010e974 libsfml-network.2.3.dylib`sf::Socket::getHandle() const + 4
libsfml-network.2.3.dylib`sf::Socket::getHandle:
->  0x10010e974 <+4>: movl   0xc(%rdi), %eax
    0x10010e977 <+7>: popq   %rbp
    0x10010e978 <+8>: retq  
    0x10010e979 <+9>: nopl   (%rax)

 


Le même code fonctionne bien sous linux.
Une idée ?
Merci beaucoup

4
Mon sélecteur non c'est juste un carré à déplacer au clavier pour intérargir avec la map.
Je n'avais pas pensé à ta solution c'est vrai que c'est beaucoup plus pratique, merci :)

5
Pour scroller ma map, j'ai besoin de savoir si mon sélecteur et à la moitié de l'écran, cela dit ce n'est pas trop dur à implémenter soi même -le moins bugable étant juste de maintenir les coordonnées absolue au fur et à mesure dans mon cas- bien sûr, mais ça peut être utile à d'autres je pense.

6
Bonjour, j'ai épluché la doc, sans succès, à la recherche d'une fonction réciproque de convertCoords qui, étant donné les coordonnées d'un objet renvoi ses coordonnées absolues sur l'écran. Merci !

7
D'accord, merci !

8
D'accord, je pensais que la position d un sprite etait aussi en pixels, enfin moi ca a toujours correspondu, dans quel cas la position d'un sprite n'est pas en pixel ? si on fixe un repère ?

9
Graphique / [Résolu]Petite question, RenderWindow::convertCoords
« le: Novembre 07, 2012, 03:08:39 pm »
Bonjour, je voulais demander pourquoi la fonction :
Vector2f        convertCoords (const Vector2i &point) const
Prend elle en argument un Vector2<int> (pour renvoyer un Vector2<float>) alors que Sprite::getPosition renvoie un Vector2f, ce qui n'est pas du tout pratique et oblige un cast ou une copie.

10
Graphique / Re : Segfault sf::Texture
« le: Novembre 07, 2012, 11:44:05 am »
Ubuntu 10, à l'execution j'ai aussi souvent des messages de ce type :
DRM_IOCTL_GEM_CLOSE 8 failed (region): Bad file descriptor
DRM_IOCTL_GEM_CLOSE 6 failed (region): Bad file descriptor
 

Je vais voir pour les drivers.

11
Graphique / Re : Segfault sf::Texture
« le: Novembre 07, 2012, 10:25:51 am »
J'utilise la RC, avec libGlew1.7.
Carte graphique GMA 950 d'intel :
Display controller: Intel Corporation Mobile 945GM/GMS/GME, 943/940GML Express Integrated Graphics Controller (rev 03)

Les drivers sont aussi à jour que la carte (i.e 2005/2006)...

12
Graphique / Segfault sf::Texture
« le: Novembre 06, 2012, 09:00:11 pm »
Bonsoir, j'essaie depuis peu SFML 2.0.
J'ai expérimenté quelque chose d'intrigant, le code suivant :
int main()
{
   sf::Text t;
   sf::RenderWindow App(...);
   ...
}
 

Génère l'erreur suivante à l'execution qui empeche le lancement du programme :
X Error of failed request:  GLXBadContext
  Major opcode of failed request:  155 (GLX)
  Minor opcode of failed request:  3 (X_GLXCreateContext)
  Serial number of failed request:  24
  Current serial number in output stream:  29

le shell a retourné 1

En revanche, en inversant les deux lignes le programme s'exécute bien.


13
Graphique / Re : [sf::Image]Bug très étrange
« le: Novembre 06, 2012, 02:22:25 pm »
Merci beaucoup pour cette aide rapide et pour l'explication !

14
Graphique / Re : [sf::Image]Bug très étrange
« le: Novembre 06, 2012, 02:08:58 pm »
Je me suis mal exprimé, qu'est ce que le smooth filter ? (et en quoi ca influe sur le positionnement)
Bon mais tu vas me dire qu'en dit google!
Merci beaucoup, je vais essayer de me mettre à la 2.0 !

15
Graphique / Re : [sf::Image]Bug très étrange
« le: Novembre 06, 2012, 02:02:11 pm »
Oui ! c'est parfait, que change cette fonction ?

Pages: [1] 2 Suivante »