Forum de la communauté SFML

Aide => Réseau => Discussion démarrée par: Lolilolight le Juin 18, 2013, 04:08:39 pm

Titre: Problème avec les sélectors.
Posté par: Lolilolight le Juin 18, 2013, 04:08:39 pm
Salut, alors je vais mettre un code simple et minime cette fois : lorsque j'exécute ça côté serveur :
code du serveur :
if (listener.listen(4567) == Socket::Done && socketUDP.bind(4568) == Socket::Done)
        cout<<"Ok"<<endl;
    selector.add(listener);
    selector.add(socketUDP);
    while (true) {
        if (selector.wait()) {
            if (selector.isReady(listener)) {

                TcpSocket *client = new TcpSocket();
                if (listener.accept(*client) == Socket::Done) {
                    cout<<"Client connected"<<endl;
                    selector.add(*client);
                    clients.push_back(client);
                }
            } if (selector.isReady(socketUDP)) {
                Packet packet;
                IpAddress address;
                unsigned short int port;
                if (socketUDP.receive(packet,address, port) == Socket::Done) {
                    string message;
                    packet>>message;
                    cout<<"Received from client (UDP) : "<<message<<endl;
                    packet.clear();
                    message = "Ceci est un message UDP!";
                    packet<<message;
                    socketUDP.send(packet, IpAddress::LocalHost, 4569);
                }
            }
            for (unsigned int i = 0; i < clients.size(); i++) {
                if (selector.isReady(*clients[i])) {
                    Packet packet;
                    if (clients[i]->receive(packet) == Socket::Done) {
                        string message;
                        packet>>message;
                        cout<<"Received from client (TCP) : "<<message<<endl;
                        packet.clear();
                        message = "Ceci est un message TCP!";
                        packet<<message;
                        clients[i]->send(packet);
                    }
                } else {
                    selector.remove(*clients[i]);
                    vector<TcpSocket*>::iterator it;
                    for (it = clients.begin(); it != clients.end();)
                        if (*it ==clients[i])
                            it = clients.erase(it);
                        else
                            it++;
                }
            }
        }
    }
}
 
Lorsque j'envoie un message UDP suivit d'un message TCP avec le client, seul le message UDP est reçu par le serveur.
Code côté client :
#include <SFML/Network.hpp>
#include <iostream>
#include <sstream>
using namespace std;
using namespace sf;
int main () {
    TcpSocket clientTCP;
    UdpSocket socketUDP;
    SocketSelector selector;
    if (clientTCP.connect(IpAddress::LocalHost, 4567) == Socket::Done && socketUDP.bind(4569) == Socket::Done);
        cout<<"Ok"<<endl;
    selector.add(clientTCP);
    selector.add(socketUDP);
    Packet packet;
    string message = "";
    stringstream ss;
    ss<<"Ceci est un message pour test le protocole TCP avec la SFML."<<endl;
    message += ss.str();

    packet<<message;
    clientTCP.send(packet);
    packet.clear();
    message = "Ceci est un message UDP!";
    packet<<message;
    socketUDP.send(packet,IpAddress::LocalHost,4568);
    while (true) {
        if (selector.wait()) {
            packet.clear();
            message = "";
            IpAddress address;
            unsigned short int port;
            if (selector.isReady(clientTCP)) {
                if (clientTCP.receive(packet) == Socket::Done) {
                    packet>>message;
                    cout<<"Received from server (TCP) : "<<message<<endl;
                }
            }
            if (selector.isReady(socketUDP) == Socket::Done) {
                if (socketUDP.receive(packet, address, port) == Socket::Done) {
                    packet>>message;
                    cout<<"Received from server (UDP) : "<<message<<endl;
                }
            }
        }
    }

    return 0;
}
 
Quand je mets des else if au lieu des if côté serveur dans la boucle ça va déja mieux mais lorsque je ferme et que je relance le client, le serveur ne reçoit juste qu'un message UDP et le client ne reçoit plus rien, bref, j'ai des ennuis avec ça dans mon plus gros projet, parfois , j'ai des messages qui n'arrivent pas et ça fait carrément planté le programme. :/
Voici la version avec les else if.
code côté serveur :
#include "server.h"
using namespace std;
using namespace sf;
void Server::launch() {
    if (listener.listen(4567) == Socket::Done && socketUDP.bind(4568) == Socket::Done)
        cout<<"Ok"<<endl;
    selector.add(listener);
    selector.add(socketUDP);
    while (true) {
        if (selector.wait()) {
            if (selector.isReady(listener)) {

                TcpSocket *client = new TcpSocket();
                if (listener.accept(*client) == Socket::Done) {
                    cout<<"Client connected"<<endl;
                    selector.add(*client);
                    clients.push_back(client);
                }
            }  else if (selector.isReady(socketUDP)) {
                Packet packet;
                IpAddress address;
                unsigned short int port;
                if (socketUDP.receive(packet,address, port) == Socket::Done) {
                    string message;
                    packet>>message;
                    cout<<"Received from client (UDP) : "<<message<<endl;
                    packet.clear();
                    message = "Ceci est un message UDP!";
                    packet<<message;
                    socketUDP.send(packet, IpAddress::LocalHost, 4569);
                }
            } else {
                for (unsigned int i = 0; i < clients.size(); i++) {
                    if (selector.isReady(*clients[i])) {
                        Packet packet;
                        if (clients[i]->receive(packet) == Socket::Done) {
                            string message;
                            packet>>message;
                            cout<<"Received from client (TCP) : "<<message<<endl;
                            packet.clear();
                            message = "Ceci est un message TCP!";
                            packet<<message;
                            clients[i]->send(packet);
                        }
                    } else {
                        selector.remove(*clients[i]);
                        vector<TcpSocket*>::iterator it;
                        for (it = clients.begin(); it != clients.end();)
                            if (*it ==clients[i])
                                it = clients.erase(it);
                            else
                                it++;
                    }
                }
            }
        }
    }
}
 
code côté client.

Le même que celui ci-dessus.

PS : la méthode close() est en protected, on a plus besoin de le faire ça, la sfml le fait automatiquement ?
Titre: Re : Problème avec les sélectors.
Posté par: Lolilolight le Juin 18, 2013, 10:04:57 pm
Autre chose, parfois il ne m'affiche aucune message en TCP et ça bloque (il ne m'affiche rien au débuguage), ou alors un reste d'un ancien paquet, ça dépend, dans mon exemple si je renvoie 2 fois le même message au client là ça ne marche plus, il ne le reçoit pas.
Titre: Re : Problème avec les sélectors.
Posté par: Lolilolight le Juin 19, 2013, 08:37:21 am
J'ai tester ce code là, quand le serveur envoient plusieurs messages, le client ne reçois que les messages TCP :
#include "server.h"
using namespace std;
using namespace sf;
void Server::launch() {
    if (listener.listen(4567) == Socket::Done && socketUDP.bind(4568) == Socket::Done)
        cout<<"Ok"<<endl;
    selector.add(listener);
    selector.add(socketUDP);
    while (true) {
        if (selector.wait()) {
            if (selector.isReady(listener)) {

                TcpSocket *client = new TcpSocket();
                if (listener.accept(*client) == Socket::Done) {
                    cout<<"Client connected"<<endl;
                    selector.add(*client);
                    clients.push_back(client);
                }
            }  else if (selector.isReady(socketUDP)) {
                Packet packet;
                IpAddress address;
                unsigned short int port;
                if (socketUDP.receive(packet,address, port) == Socket::Done) {
                    string message;
                    packet>>message;
                    cout<<"Received from client (UDP) : "<<message<<endl;
                    packet.clear();
                    message = "Ceci est un message UDP!";
                    packet<<message;
                    socketUDP.send(packet, IpAddress::LocalHost, 4569);
                    socketUDP.send(packet, IpAddress::LocalHost, 4569);
                }
            } else {
                for (unsigned int i = 0; i < clients.size(); i++) {
                    if (selector.isReady(*clients[i])) {
                        Packet packet;
                        if (clients[i]->receive(packet) == Socket::Done) {
                            string message;
                            packet>>message;
                            cout<<"Received from client (TCP) : "<<message<<endl;
                            packet.clear();
                            message = "Ceci est un message TCP!";
                            packet<<message;
                            clients[i]->send(packet);
                            clients[i]->send(packet);
                        }
                    } else {
                        selector.remove(*clients[i]);
                        vector<TcpSocket*>::iterator it;
                        for (it = clients.begin(); it != clients.end();)
                            if (*it ==clients[i])
                                it = clients.erase(it);
                            else
                                it++;
                    }
                }
            }
        }
    }
}
 
Et comme je l'ai déja dis quand je ferme puis relance le client sans fermer le serveur, le serveur reçois que le messsage UDP.
Bizarre.
Tu es tout seul pour coder cette librairie ?
Bref si un jour tu tests ça chez toi, ou bien au pire je ferai appel à une autre librairie pour la gestion du réseau.
Pour ma part je vais essayer de compiler la sfml en mode debug pour voir si j'ai plus d'infos parce que la..., c'est chercher une aiguille dans une botte de foin.
PS : non, pas de message d'erreur en mode debug, la seule chose qui change est que il m'affiche 2 messages TCP et 1 message UDP pour le client donc il m'afficje des choses différentes en version release et en version débug.
Titre: Re : Problème avec les sélectors.
Posté par: Laurent le Juin 19, 2013, 08:50:34 am
Je vais essayer de tester ça, mais je ne te garantis rien, je n'ai pas beaucoup de temps libre en ce moment :(
Titre: Re : Problème avec les sélectors.
Posté par: Lolilolight le Juin 19, 2013, 09:33:15 am
Ok. :/
Sinon comment est ce que je pourrai avoir plus d'informations sur les erreurs renvoyées par la méhode send ?
Dans mon application à certains moment la méthode send me renvoie une erreur :
void User::sendTCPMessage(Packet& packet) {
    if(clientTCP.send(packet) == Socket::Done)
        cout<<"Ok"<<endl;
    else
        cout<<"Error"<<endl;
}
void User::sendUDPMessage(Packet &packet) {
    if (clientUDP.send(packet, address, remotePortUDP) == Socket::Done)
        cout<<"Ok"<<endl;
    else
        cout<<"Error"<<endl;
}
 

La gestion du réseau est exactement la même que dans le code que je t'ai donné en simplifié, dans mon plus gros projet, la seule chose qui change est que j'envoie plus de messages dans mon plus gros projet bien évidement.
Comment pourrai je savoir si je surcharge la pile TCP par exemple ?
Titre: Re : Problème avec les sélectors.
Posté par: Laurent le Juin 19, 2013, 09:36:59 am
Via SFML tu ne peux pas avoir plus d'information.

J'ai compilé ton code et trouvé une première cacahuète : dans le code client, tu as un ; à la fin de la ligne "if (connect && bind)".

Maintenant je teste.
Titre: Re : Problème avec les sélectors.
Posté par: Laurent le Juin 19, 2013, 09:46:50 am
Erreur de logique : il ne faut pas appeler la fonction isReady avec des "else if", il peut y avoir plusieurs sockets prêtes en même temps, ce n'est pas exclusif. C'est d'ailleurs ce qui arrive dans ton test : le client envoie le message TCP et le message UDP en même temps, et du coup côté serveur seul le premier à arriver est traité alors que les deux sockets sont prêtes.

Dis moi si après ça il te reste encore des erreurs.
Titre: Re : Problème avec les sélectors.
Posté par: Lolilolight le Juin 19, 2013, 09:59:20 am
Ok mais quand j'enlève le else if et donc le code côté serveur ressemble donc à ça :
#include "server.h"
using namespace std;
using namespace sf;
void Server::launch() {
    if (listener.listen(4567) == Socket::Done && socketUDP.bind(4568) == Socket::Done)
        cout<<"Ok"<<endl;
    selector.add(listener);
    selector.add(socketUDP);
    while (true) {
        if (selector.wait()) {
            if (selector.isReady(listener)) {

                TcpSocket *client = new TcpSocket();
                if (listener.accept(*client) == Socket::Done) {
                    cout<<"Client connected"<<endl;
                    selector.add(*client);
                    clients.push_back(client);
                }
            }
            for (unsigned int i = 0; i < clients.size(); i++) {
                if (selector.isReady(*clients[i])) {
                    Packet packet;
                    if (clients[i]->receive(packet) == Socket::Done) {
                        string message;
                        packet>>message;
                        cout<<"Received from client (TCP) : "<<message<<endl;
                        packet.clear();
                        message = "Ceci est un message TCP!";
                        packet<<message;
                        if(clients[i]->send(packet) == Socket::Done)
                            cout<<"Ok"<<endl;
                        else
                            cout<<"Erreur"<<endl;
                        if(clients[i]->send(packet) == Socket::Done)
                            cout<<"Ok"<<endl;
                        else
                            cout<<"Erreur"<<endl;
                    }
                } else {
                    selector.remove(*clients[i]);
                    vector<TcpSocket*>::iterator it;
                    for (it = clients.begin(); it != clients.end();)
                        if (*it ==clients[i])
                            it = clients.erase(it);
                        else
                            it++;
                }
            }
            if (selector.isReady(socketUDP)) {
                Packet packet;
                IpAddress address;
                unsigned short int port;
                if (socketUDP.receive(packet,address, port) == Socket::Done) {
                    string message;
                    packet>>message;
                    cout<<"Received from client (UDP) : "<<message<<endl;
                    packet.clear();
                    message = "Ceci est un message UDP!";
                    packet<<message;
                    if(socketUDP.send(packet, IpAddress::LocalHost, 4569) == Socket::Done)
                        cout<<"Ok"<<endl;
                    else
                        cout<<"Erreur"<<endl;
                    if(socketUDP.send(packet, IpAddress::LocalHost, 4569) == Socket::Done)
                        cout<<"Ok"<<endl;
                    else
                        cout<<"Erreur"<<endl;
                }
            }
        }
    }
}
 
Le serveur ne reçoit que le message UDP, pourquoi ça marche chez toi ?
PS : Ha par contre dans ma plus grosse appli là ça marche mieux et la fonction send ne me renvoie plus d'erreur depuis que j'ai enlever les "else if".
Titre: Re : Problème avec les sélectors.
Posté par: Lolilolight le Juin 19, 2013, 10:50:07 am
Bon écoute ce n'est plus la peine de chercher car dans mon gros projet, ça marche.
Depuis que j'ai recompiler la SFML avec le nouveau patch, et que j'envoie des plus long message en TCP au lieu d'envoyer plusieurs petits messages, bah la fonction send ne me renvoie plus d'erreur et le client reçoit bien tout mes messages.  :)
Titre: Re : Problème avec les sélectors.
Posté par: Laurent le Juin 19, 2013, 11:00:49 am
Cool :)

Par contre je crois qu'il y a une erreur dans ton dernier morceau de code : le "else" qui supprime le client est associé au "if isReady" alors qu'il devrait être associé à "if receive == Done".
Titre: Re : Problème avec les sélectors.
Posté par: Lolilolight le Juin 19, 2013, 12:27:49 pm
Ha oui juste c'est ça qui foirait tout dans ce petit bout code que j'avais donc, mal recopier de mon plus gros projet.

Par contre la pile TCP me semble assez petite, comment on peut connaitre sa taille ?
Je voudrais juste savoir combien de messages max je peux envoyer en même temps.
Titre: Re : Problème avec les sélectors.
Posté par: Laurent le Juin 19, 2013, 12:49:40 pm
Pour connaître le nombre d'octets que tu peux envoyer sans exploser la file d'attente, le mieux est encore de faire un test qui augmente progressivement la taille envoyée jusqu'à ce que la fonction send() te renvoie autre chose que Socket::Done.

Mais au fait, pourquoi as-tu besoin d'envoyer autant de données ?
Titre: Re : Problème avec les sélectors.
Posté par: Lolilolight le Juin 19, 2013, 01:11:41 pm
Bah, je n'en envoie pas beaucoup, juste les informations sur le personnage et le monstre toutes les secondes (ça je l'envoie en UDP) et quelques informations en TCP du genre un ensemble de points pour les déplacements du monstre et du personnage à la souris (Le pathfinding quoi.) à chaque fois que le personnage ou le monstre change de trajet.



Titre: Re : Problème avec les sélectors.
Posté par: Laurent le Juin 19, 2013, 01:22:19 pm
Et avec ces informations de pathfinding, tu excèdes les 65 Ko en un coup ?
Titre: Re : Problème avec les sélectors.
Posté par: Lolilolight le Juin 19, 2013, 01:27:59 pm
Non mais j'ai des erreurs que me renvoie send si j'envoie trop de paquets d'un coup.
Titre: Re : Problème avec les sélectors.
Posté par: Lolilolight le Juin 19, 2013, 03:38:42 pm
Arf purée j'ai des erreurs avec la fonction send par moment et je n'arrive pas à avoir plus de détails à ce sujet avec la SFML, je pense que je vais aller voir si il n'y a pas une autre librairie en c++ semblable au module réseau de la SFML et essayer avec.
Parfois aussi j'ai carrément un blocage.
Titre: Re : Problème avec les sélectors.
Posté par: Laurent le Juin 19, 2013, 03:46:58 pm
Ca m'arrangerait beaucoup plus si on essayait plutôt de corriger ces erreurs ;)
Titre: Re : Problème avec les sélectors.
Posté par: Lolilolight le Juin 19, 2013, 03:55:50 pm
Ok. :) Mais difficile quand on arrive pas à avoir beaucoup d'informations sur ses erreurs.
Titre: Re : Problème avec les sélectors.
Posté par: Laurent le Juin 19, 2013, 03:59:37 pm
Ca je m'en chargerai. Tout ce qu'il faut, c'est un code complet minimal qui reproduit le problème. C'est pas forcément évident, mais sans ça on ne pourra pas avancer.
Titre: Re : Problème avec les sélectors.
Posté par: Lolilolight le Juin 19, 2013, 04:02:32 pm
Ok, ok.
Bah écoute déja le problème ne survient pas à chaque exécution, bref, je vais essayer de reproduire le problème avec un code plus petit.
Titre: Re : Problème avec les sélectors.
Posté par: Lolilolight le Juin 20, 2013, 07:10:46 am
Bon, je pense avoir trouvé la cause du problème, quand j'envoie plusieurs messages UDP du serveur vers le client, le client ne les reçoit plus au bout d'un moment par contre pas de problème pour les messages TCP, et du client vers le serveur ça marche toujours.
Je remet les 2 codes sources, j'ai modifié celui du client en envoyant les messages dans la boucle, j'ai du rajouté un sleep dans la boucle sinon, j'explose la file TCP.

Code côté serveur :

#include "server.h"
using namespace std;
using namespace sf;
void Server::launch() {
    if (listener.listen(4567) == Socket::Done && socketUDP.bind(4568) == Socket::Done)
        cout<<"Ok"<<endl;
    selector.add(listener);
    selector.add(socketUDP);
    while (true) {
        if (selector.wait()) {
            if (selector.isReady(listener)) {

                TcpSocket *client = new TcpSocket();
                if (listener.accept(*client) == Socket::Done) {
                    cout<<"Client connected"<<endl;
                    selector.add(*client);
                    clients.push_back(client);
                }
            }
            for (unsigned int i = 0; i < clients.size(); i++) {
                if (selector.isReady(*clients[i])) {
                    Packet packet;
                    if (clients[i]->receive(packet) == Socket::Done) {
                        string message;
                        packet>>message;
                        cout<<"Received from client (TCP) : "<<message<<endl;
                        packet.clear();
                        message = "Ceci est un message TCP!";
                        packet<<message;
                        if(clients[i]->send(packet) == Socket::Done)
                            cout<<"Ok"<<endl;
                        else
                            cout<<"Erreur"<<endl;
                    } else {
                        selector.remove(*clients[i]);
                        vector<TcpSocket*>::iterator it;
                        for (it = clients.begin(); it != clients.end();)
                            if (*it ==clients[i])
                                it = clients.erase(it);
                            else
                                it++;
                    }
                }
            }
            if (selector.isReady(socketUDP)) {
                Packet packet;
                IpAddress address;
                unsigned short int port;
                if (socketUDP.receive(packet,address, port) == Socket::Done) {
                    string message;
                    packet>>message;
                    cout<<"Received from client (UDP) : "<<message<<endl;
                    packet.clear();
                    message = "Ceci est un message UDP!";
                    packet<<message;
                    if(socketUDP.send(packet, IpAddress::LocalHost, 4569) == Socket::Done)
                        cout<<"Ok"<<endl;
                    else
                        cout<<"Erreur"<<endl;

                }
            }
        }
    }
}
 

Code côté client :

#include <SFML/Network.hpp>
#include <iostream>
#include <sstream>
using namespace std;
using namespace sf;
int main () {
    TcpSocket clientTCP;
    UdpSocket socketUDP;
    SocketSelector selector;
    if (clientTCP.connect(IpAddress::LocalHost, 4567) == Socket::Done && socketUDP.bind(4569) == Socket::Done)
        cout<<"Ok"<<endl;
    selector.add(clientTCP);
    selector.add(socketUDP);
    while (true) {

        Packet packet;
        string message = "";
        stringstream ss;
        ss<<"Ceci est un message pour test le protocole TCP avec la SFML."<<endl;
        message += ss.str();
        packet<<message;
        if (clientTCP.send(packet) == Socket::Done)
            cout<<"Ok"<<endl;
        else
            cout<<"Erreur"<<endl;
        packet.clear();
        message = "Ceci est un message UDP!";
        packet<<message;
        if (socketUDP.send(packet,IpAddress::LocalHost,4568) == Socket::Done)
            cout<<"Ok"<<endl;
        else
            cout<<"Erreur"<<endl;
        if (selector.wait()) {
            packet.clear();
            message = "";
            IpAddress address;
            unsigned short int port;
            if (selector.isReady(clientTCP)) {
                if (clientTCP.receive(packet) == Socket::Done) {
                    packet>>message;
                    cout<<"Received from server (TCP) : "<<message<<endl;
                }
            }
            if (selector.isReady(socketUDP) == Socket::Done) {

                if (socketUDP.receive(packet, address, port) == Socket::Done) {
                    packet>>message;
                    cout<<"Received from server (UDP) : "<<message<<endl;
                }
            }
        }
        sleep(seconds(1.f));
    }
    return 0;
}
 

Titre: Re : Problème avec les sélectors.
Posté par: Laurent le Juin 20, 2013, 07:56:22 am
Impeccable, je teste ça dès que possible :)

Question : est-ce que tout le code TCP est nécessaire pour reproduire le bug UDP ? Y compris la gestion des clients ?
Titre: Re : Problème avec les sélectors.
Posté par: Lolilolight le Juin 20, 2013, 08:08:45 am
Citer
Question : est-ce que tout le code TCP est nécessaire pour reproduire le bug UDP ? Y compris la gestion des clients ?

Non, tu peux retirer ça du code si tu veux tu verra que le client ne recevra toujours pas les messages UDP.
Titre: Re : Problème avec les sélectors.
Posté par: Laurent le Juin 20, 2013, 08:20:07 am
Quand je parle de code minimal c'est ça que je veux dire : si je teste je ne veux pas m'embêter avec du code qui n'a rien à voir avec le problème. Si on essaye de régler un problème d'UDP, ça sert à quoi de coller un code qui contient pour moitié du code TCP ? :P

Tu peux me refaire ça vite fait, sans le code TCP ? Et au passage, si tu pouvais me mettre le code du serveur dans un main comme le client, ça m'éviterais d'avoir à retaper les mêmes lignes de code à chaque fois que je reprends ton code ;)
Titre: Re : Problème avec les sélectors.
Posté par: Lolilolight le Juin 20, 2013, 08:38:00 am
J'avais simplement oublié de virer le code TCP.
Bref voici le code source rien que avec de l'UDP.

Code côté serveur :

#include <SFML/Network.hpp>
#include <iostream>
using namespace sf;
using namespace std;
int main () {
    UdpSocket socketUDP;
    SocketSelector selector;
    if (socketUDP.bind(4568) == Socket::Done)
        cout<<"Ok"<<endl;
    selector.add(socketUDP);
    while (true) {
        if (selector.wait()) {
            if (selector.isReady(socketUDP)) {
                Packet packet;
                IpAddress address;
                unsigned short int port;
                if (socketUDP.receive(packet,address, port) == Socket::Done) {
                    string message;
                    packet>>message;
                    cout<<"Received from client (UDP) : "<<message<<endl;
                    packet.clear();
                    message = "Ceci est un message UDP!";
                    packet<<message;
                    socketUDP.send(packet, IpAddress::LocalHost, 4569);
                }
            }
        }
    }
    return 0;
}

 

Code côté client :

#include <SFML/Network.hpp>
#include <iostream>
#include <sstream>
using namespace std;
using namespace sf;
int main () {
    UdpSocket socketUDP;
    if (socketUDP.bind(4569) == Socket::Done)
        cout<<"Ok"<<endl;
    SocketSelector selector;
    selector.add(socketUDP);

    while (true) {
        Packet packet;
        string message = "Ceci est un message UDP!";
        packet<<message;
        socketUDP.send(packet,IpAddress::LocalHost,4568);
        if (selector.wait()) {
            packet.clear();
            message = "";
            IpAddress address;
            unsigned short int port;
            if (selector.isReady(socketUDP) == Socket::Done) {

                if (socketUDP.receive(packet, address, port) == Socket::Done) {
                    packet>>message;
                    cout<<"Received from server (UDP) : "<<message<<endl;
                }
            }
        }
        sleep(seconds(1.f));
    }
    return 0;
}
 

Le client ne reçois rien du tout chez moi.
Titre: Re : Problème avec les sélectors.
Posté par: Laurent le Juin 20, 2013, 08:45:46 am
Extra.

Avec un code aussi minimal je peux voir l'erreur sans même tester le code :

if (selector.isReady(socketUDP) == Socket::Done)

Tu t'es un peu emmêlé les pinceaux ;)

Tu devrais utiliser ton debugger dans ce genre de situation. Avec une exécution pas à pas tu aurais vu que ça bloquait sur cette ligne, et en regardant le retour de isReady tu aurais forcément compris que ce n'était pas Socket::Done.
Titre: Re : Problème avec les sélectors.
Posté par: Lolilolight le Juin 20, 2013, 08:52:40 am
Ha en effet je ne sais pas pourquoi j'ai rajouté le == Socket::Done
Bref le bug du coup ne viens pas de la je vais devoir chercher ailleurs.
Titre: Re : Problème avec les sélectors.
Posté par: Lolilolight le Juin 20, 2013, 09:34:30 am
Trouvé!   :D

En fait dans mon plus gros projet j'avais bien fait, j'avais pas rajouté le == Socket::Done après le isReady.

J'avais juste oublié de faire un packet.clear(); ici : (Chose que j'oublie souvent de faire vu que les fonctions send et receive des socket n'écrasent pas les données automatiquement les anciennes données lue ou écrite dans le paquet.)

while (running) {
        if (selector.wait()) {
            if (selector.isReady(clientTCP)) {
                packet.clear();
                if(clientTCP.receive(packet) == Socket::Done) {
                    string message;
                    packet>>message;
                    Network::addResponse(message);
                }
            }
            if (selector.isReady(clientUDP)) {
                packet.clear();
                if (clientUDP.receive(packet, address, port) == Socket::Done) {

                    if (address == Configuration::serverAddress) {
                        string message;
                        packet>>message;
                        Network::addResponse(message);
                        remotePortUDP = (remotePortUDP != port) ? port : remotePortUDP;
                    } else {
                        cout<<"This message don't provide from the server."<<endl;
                    }
                }
            }
        }
    }
 

J'avais oublié de faire un packet.clear() avant le clientUDP.receive(packet, address, port);
 et c'est ça qui faisait tout foiré. :/
Titre: Re : Problème avec les sélectors.
Posté par: Lolilolight le Juin 20, 2013, 10:14:21 am
Par contre je ne vais pas dire qu'il n'y a de bugs dans mon code parce que ce n'est pas vrai..., par moment j'ai des erreurs renvoyée par la fonction send, mais, j'ai encore trop peu d'informations et encore fait trop peu de test pour savoir pourquoi ça bug...
Titre: Re : Problème avec les sélectors.
Posté par: Lolilolight le Juin 20, 2013, 04:31:06 pm
Bon, c'est difficile de faire un code minimiste sur ça car c'est aléatoire, mais, quand je reçois pas de données en UDP (ce qui peut arriver en UDP.) ça freeze et je suis obligé de fermé et réouvrir le programme.
Titre: Re : Problème avec les sélectors.
Posté par: Lolilolight le Juin 21, 2013, 10:24:43 am
Bon, je pense avoir trouvé mon dernier bug avec les erreurs que me renvoiyaient la fonction send j'ai fait une erreur dans mon code lors de la déconnection du client donc il envoyaient des messages à un client qui était déconnecté.
Bref je trouve que on devrait quand même avoir plus de précision sur ce genre d'erreur car là j'ai vraiment du mal à déboguer je pense qu'une autre librairie m'aurait sans doute permis de détecter ses erreurs plus rapidement.
Plutôt que de devoir faire des cout de tout ce que j'envoie et tout ce que je reçois. :/