Bonjour,
Voici bientôt 2 heures que je bute sur la même erreur, voici le bout de code en question:
Mon Objet mISA s'affiche parfaitement bien: mISA.getReceiver().sin_port et mISA.getType() retourne bien ce qu'il faut, en revanche une fois inséré dans ma liste avec lsSendBackMsg.push_back(mISA); l'objet lsSendBackMsg.back() me retourne n'importe quoi:
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 // Ici une méthode static de Server appelé par un thread // data est une référence vers ma classe Server void* Server::loopISA(void* data){ Server* _this = reinterpret_cast<Server*>(data); while(true) { // Je parcours une liste de client vector<struct Client>::iterator it; for (it = lsClient.begin(); it!=lsClient.end ();++it) { // Je créér une instance d'une Classe MessageTimer MessageTimer mISA(Message(Message::ISA,"Are you alive?")); mISA.setReceiver(it->sin); mISA.send(_this->_sockfd); //Message bien envoyé et recu à l'addresse it->sin // lsSendBackMsg est un attribut de ma classe Server: vector<MessageTimer> lsSendBackMsg; _this->lsSendBackMsg.push_back(mISA); cout << "port:" << ntohs(_this->lsSendBackMsg.back().getReceiver().sin_port) << "=?=" << ntohs(mISA.getReceiver().sin_port) << endl; cout << "type:" << _this->lsSendBackMsg.back().getType() << "=?=" << mISA.getType() << endl;
Voici un éxemple d'éxécution: (aucune erreur/warning à la compilation)
Je précise qu'il n'y a aucun autre thread lancé en concurrence, il n'y a que ce thread qui modifie et parcours cette liste pendant l'éxécution de mon programme...
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 // port=40765 et type=13 attendu port:0=?=40765 type:13=?=13 port:0=?=40765 type:13=?=13 port:0=?=40765 type:13=?=13 port:52489=?=40765 type:13=?=13 port:52489=?=40765 type:13=?=13 port:52489=?=40765 type:13=?=13 port:0=?=40765 type:13=?=13 port:0=?=40765 type:13=?=13 port:0=?=40765 type:13=?=13 port:0=?=40765 type:13=?=13
Merci de votre aide,
@J'ajoute le code des classes MessageTimer et Message (ne sait-on jamais...)
Je n'ai laissé que les méthodes utilisées.
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 #ifndef _Message_hh #define _Message_hh #include <vector> #include <string> #include <cstdlib> #include <cstdio> #include <iostream> #include <sstream> #include <netinet/in.h> #include <arpa/inet.h> #include <errno.h> #include <stdarg.h> #include <string.h> #define CONTENT_SIZE 510 using namespace std; class Message { private: int _type; char _c_content[CONTENT_SIZE]; int _c_offset; struct sockaddr_in sender; struct sockaddr_in receiver; //Construction par buffer public: //Construction par type + content Message(int type=0,const string& content=""){ _type=type; strcpy(_c_content,content.c_str()); _c_offset=content.length(); } //Construction par copie Message(const Message& msg){ *this=msg; } Message& operator=(const Message& msg){ for(int i=0;i<(int)msg._c_offset;i++) _c_content[i]=msg._c_content[i]; _c_offset=msg._c_offset; _type=msg._type; return *this; } // Envoie le message au receiver void send(int sockWrite){ // un sendto() .... } //Getter & Setter public: //getter,setter Adresse recepteur void setReceiver(const sockaddr_in &sin){ receiver=sin; } const sockaddr_in& getReceiver() const { return receiver; } const int getType() const{ return _type; } }; #endif
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 #ifndef _MessageTimer_hh #define _MessageTimer_hh #include "Message.hh" #include <time.h> class MessageTimer: public Message { private: time_t _time; int _nbSendBack; public: // Construction d'un messageTimer MessageTimer(const Message& msg,const int nbSendBack=0): Message(msg) { _time=time(NULL); _nbSendBack=nbSendBack; } }; #endif
Partager