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

Pages: [1]
1
Bonsoir, dans le cadre d'un projet universitaire je suis confronté à une difficulté qu'est de créer un serveur donc avec SFML multithreadé (du moins je pense). Cependant je dois mal m'y prendre car je rencontre quelques problèmes...


Approche global de ma vision du serveur :

Le serveur démarre, se met en attente de nouveaux clients, j'ai donc une boucle qui tourne tant que le serveur n'est pas off, à chaque connexion d'un client je démarre un nouveau thread qui sera dédié à la communication avec ce client au moyen du socket, chaque client est stocké dans une map avec un id et son objet connexion (qui comporte la méthode threadé d'au dessus), dans cette méthode j'ai aussi une boucle active tant que la connexion est active puis je lis les paquets reçus, les traites etc.

Je dois passer par des paquets pour faire transiter les données du client vers le serveur, c'est le moyen que je trouve le plus simple et plus intuitif pour ce type de projet. J'utilise des paquets TCP, UDP n'étant pas adapté au projet.

J'aimerais donc avoir des éclaircissement sur comment mettre en place un tel serveur, comment gérer les connexions/déconnexions des clients, la réception des paquets etc le tout le plus optimisé possible.

Mes problèmes
Mon serveur reçoit le paquet mais pompe environ 20% du processeur, je reçois 0 dans le paquet lu alors que j'envoie 42.


Voici ce que j'ai actuellement fait (qui ne fonctionne pas) :

Client

bool Client::connect() {
    bool success = m_socket.connect(m_host, m_port) == sf::Socket::Done;

    if(success){
        std::cout << "Connected !" << std::endl;
        m_active = true;
        std::thread thread(sendData, this);
        thread.detach();
    }else{
        std::cerr << "Unable to connect to server" << std::endl;
    }

    return success;
}

//Ma méthode qui enverra les paquets,
void Client::sendData() {
    sf::Packet packet;
    int i = 42;
    packet << i;
    m_socket.send(packet);
}

 

Server

void Server::start() {

    if(m_port == 0){
        std::cerr << "Error the server must have a port !" << std::endl;
        return;
    }

    if(m_listener.listen(m_port) != sf::Socket::Done){
        std::cerr << "Error while starting server, port is already in use" << std::endl;
        return;
    }

    m_active = true;
    std::cout << "Server started on port " << m_port << " waiting for new client..." << std::endl;

    sf::TcpSocket clientSocket;

    while(m_active){

        if(m_listener.accept(clientSocket) != sf::Socket::Done){
            std::cerr << "Error while receiving new connection" << std::endl;
        }

        unsigned short id = generateClientId();
        ClientConnection *clientConnection = new ClientConnection(0, clientSocket);
        clientConnection->setActive(true);
        addClient(id, clientConnection);
        clientConnection->listenPackets();
        std::cout << "New client connected, starting thread !" << std::endl;
        std::thread thread(&ClientConnection::listenPackets, clientConnection);
        thread.detach();
    }

    std::cout << "Server stopped" << std::endl;

}

//Méthode qui gère la réception des paquets
void ClientConnection::listenPackets() {
    sf::Packet packet;
    int a;
    while(m_active){
        m_socket->receive(packet);
        while(!packet.endOfPacket()){
            packet >> a;
            std::cout << "Recu " << a << std::endl;
        }
    }
}

 

Voila globalement les parties les plus intéressantes, toute aide est la bienvenue.

Bonne soirée, merci.  :)

Clyx.

2
Général / Grille Hexagonale avec vertex array
« le: Octobre 06, 2016, 08:00:27 pm »
Bonsoir,

je suis en galère depuis bientôt 1 semaine en essayant de faire un algo me permettant de rendre une map (tilemap) hexagonale.

J'ai du mal au niveau des maths qui se cache derrière la science des hexagones c'est pourquoi je fait appel à vous.

J'aimerais savoir comment implémenter ce système à travers SFML de manière optimisée.
Pour le moment j'ai une classe héritant de Drawable et c'est à peu près tout.. enfin j'ai une méthode pour tenter d'initialiser mes hexagones mais je n'y parvient pas.

Dans la forme j'aimerais être capable de rendre une map de longueur W et de hauteur H, avec des carrés je n'ai aucun problème mais avec des hexagones je suis complètement paumé.

Voici ou j'en suis :

(click to show/hide)

PS: Mes hexagons sont orienté "Pointy" ou dit verticaux.

Toute aide est la bienvenue.


Merci d'avance.

Pages: [1]
anything