Bonjour à tou(te)s,
J'ai un souci que je n'arrive vraiment pas à régler et plus je m'y essaye, plus j'ai l'impression de ne pas voir l'évidence.
Je cherche donc à faire un client Telnet. Pour cela, j'ai donc une classe Telnet qui me permet de me connecter à un serveur. Pour bien recevoir les données du serveur je lance un Thread qui va vérifier si j'ai recu des données de temps en temps. Pour info, j'utilise la SFML tout ca :
La methode lance donc le Thread qui est une classe dérivée afin qu'il fasse bien ce que je souhaite (méthode virtuelle redéfinie) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 class Telnet { public : //Constructeur par défaut Telnet(void); //Connexion à un site void Connect(const std::string& host, unsigned short port = 23); //Pour vérifier qu'on est bien connecté bool IsConnected(void); private : //Les informations de connexion std::string mHostName; sf::IPAddress mHost; unsigned short mPort; //La socket permettant de recevoir et d'envoyer des données sf::SocketTCP mConnection; //Booléen permettant de savoir si on est toujours connecté ou pas bool mIsConnected; //Le thread de réception des données envoyées par le serveur ReceptionThread mReceptionThread; };
Bon, ici ce n'est qu'un test, donc je déconnecte tout de suite. Voici le code du main :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 class ReceptionThread : public sf::Thread { private: virtual void Run () { std::cout<<"Deconnexion"<<std::endl; mIsConnected = false; } };
Mes soucis :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 int main() { Telnet t; t.Connect("crawl.akrasiac.org"); while (t.IsConnected()) { //On attend sans rien faire } return EXIT_SUCCESS; }
- Soit je définis une classe avant l'autre et j'ai des soucis puisque l'autre n'est pas encore définie. Je sais qu'il faut définir partiellement la première afin de ne pas faire d'erreur, mais je n'arrive plus à retrouver comment on fait :/
- De plus, l'accès à un membre privé, c'est moyen. Je ne veux, bien entendu, pas avoir de setter public ca n'a rien à faire dans l'interface.
J'ai tenté de définir ReceptionThread dans la classe Telnet en privé puisque l'utilisateur ne devrait pas y avoir accès et de rendre celle-ci amie de la classe Telnet, masi ca ne marche pas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 class Telnet { public : //Constructeur par défaut Telnet(void); //Connexion à un site void Connect(const std::string& host, unsigned short port = 23); //Pour vérifier qu'on est bien connecté bool IsConnected(void); private : friend class ReceptionThread; class ReceptionThread : public sf::Thread { private: virtual void Run () { std::cout<<"Deconnexion"<<std::endl; mIsConnected = false; } }; //Les informations de connexion std::string mHostName; sf::IPAddress mHost; unsigned short mPort; //La socket permettant de recevoir et d'envoyer des données sf::SocketTCP mConnection; //Booléen permettant de savoir si on est toujours connecté ou pas bool mIsConnected; //Le thread de réception des données envoyées par le serveur ReceptionThread mReceptionThread; };Merci d'avance à ceux (celles ?) qui auraient des (une au moins ?) idées !Envoyé par Debug
PS : post identique sur le SdZ, mais ils répondent pas
Partager