Ik heb een chat-servertje gemaakt om te chatten. om de online users op te slaan heb ik hierbij gebruikt gemaakt van een map (de QMap van qt). logs van de server tot de segmetationfault (heb er zelf wat commentaar bij gezet in c++ stijl:
^T is wat eigen code voor het chatprogramma die er op werkt.
en dit is het stukje code waar het soms fout gaat en soms ook niet.
en sorry dat het zo lang is maar ik kan niet exact aanwijzen waar het verkeerd gaat.
als het nog niet duidelijk is:
Ik wil de segmentation fault eruit en heb al vanalles geprobeerd om het eruit te krijgen maar ik kan de fout gewoon niet vinden. en wordt de data niet naar alle gebruikers verstuurd. en volgens mij gaat het bij de map_read.erase() fout.
* Shadowman hoopt dat het probleem duidelijk is
code:
1
2
3
4
5
6
7
8
9
10
| Shadowman^T 9 0x40d1b6c8 Nieuwe naam: Shadowman3 Shadowman2^TShadowman3^T // verzonden naar Shadowman Shadowman^TShadowman3^T // verzonden naar Shadowman2 Shadowman^TShadowman2^T // verzonden naar Shadowman3 verzend naar: Shadowman de mededeling dat er iemand is weggegaan: gebeurd Shadowman2 is verdwenen (spoorloos) map_read.erase(data) |
^T is wat eigen code voor het chatprogramma die er op werkt.
en dit is het stukje code waar het soms fout gaat en soms ook niet.
C++:
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
| void MyServerSocket::discardclient(void) { QSocket *gebruiker=(QSocket*)sender(); user::Iterator data; for (data=map_read.begin(); data!=map_read.end(); data++) { if (data.data().return_socket()==gebruiker) { cout << data.data().gebruiker() << " is verdwenen (spoorloos)" << endl; map_read.erase(data); cout << "map_read.erase(data)" << endl; // break; } else { cout << "verzend naar: " << data.data().gebruiker() << " de mededeling dat er iemand is weggegaan"; data.data().return_socket()->writeBlock("Er is iemand weggegaan\r\n", 25); cout << ": gebeurd" << endl; } } cout << "<online:>" << endl; for (user::Iterator online_users=map_read.begin(); online_users!=map_read.end(); ++online_users) { cout << online_users.data().gebruiker() << endl; } cout << "</online:>" << endl; for (user::Iterator data2=map_read.begin(); data2!=map_read.end(); ++data2) { cout << "naar de gebruiker: " << data2.data().gebruiker() << "wordt nu troep verzonden" << endl; users *verzenden=&data2.data(); QString usernames="\x14"; usernames.append(this->verzend_gebruikers(verzenden->return_socket())); usernames.append("\r\n"); verzenden->return_socket()->writeBlock(usernames.ascii(), usernames.length()); QString melding="Er is iemand verdwenen<BR>\r\n"; verzenden->return_socket()->writeBlock(melding.ascii(), melding.length()); } // delete gebruiker; // cout << "delete gebruiker" << endl; } |
en sorry dat het zo lang is maar ik kan niet exact aanwijzen waar het verkeerd gaat.
als het nog niet duidelijk is:
Ik wil de segmentation fault eruit en heb al vanalles geprobeerd om het eruit te krijgen maar ik kan de fout gewoon niet vinden. en wordt de data niet naar alle gebruikers verstuurd. en volgens mij gaat het bij de map_read.erase() fout.
* Shadowman hoopt dat het probleem duidelijk is