Sehr merkwürdiges Problem mit nem Zeiger
-
Hi,
ich schreibe grade unter Linux einen Server basierend auf C++ und Sockets. Habe ein sehr merkwürdiges Problem, denn mein Client verliert auf einmal die Verbindung und ich weiß nicht warum.
Vielleicht poste ich erstmal code:Hier in diesem Code tritt der Fehler auf. Erklärung folgt weiter unten.
void *CClient::Handle() { log->Print("Client verbunden\n"); s->Send("Willkommen auf dem Linux Remote Manager - Server\n",sender); bool status = true; char *buffer; while(status == true) { //memset(buffer,0,strlen(buffer)); buffer = NULL; buffer = s->Recv(sender); if(strcmp(buffer,"") == 0) { status = false; log->Print("Client disconnected\n"); s->Close(sender); pthread_exit(NULL); } else { //log->Print(buffer); Parse(buffer); } } } void CClient::Parse(char *text) { if(strspn(text,"LOGIN") >= 0) { char *buf = text; Login(buf); } else if(strspn(text,"LOGOUT") >= 0) { this->Logout(); } } int CClient::Login(char *text) { printf("jehaa\n"); return 0; }Hier nun die Socket Methoden
int CSocket::Send(char *text,int sender) { long rc = send(sender,text,strlen(text),0); if(rc == -1) { log->Print("Fehler beim senden\n"); return 0; } else return 1; } char *CSocket::Recv(int sender) { char *buffer = new char[1024]; memset(buffer,strlen(buffer),0); string sbuffer; char c; int bytes; while(c != '\n') { bytes = recv(sender,&c,1,0); if(bytes<=0) { return ""; } else { sbuffer += c; } } strcpy(buffer,sbuffer.c_str()); return buffer; } void CSocket::Parse(char *line,char *Params[]) { int i; for(i=0;i< 20;i++) { while(*line && isspace(*line)) line++; Params[i] = line; while(*line && !isspace(*line)) line++; if(*line) *(line++) = '\0'; } }Also zur Erklärung: Der Client wird vom Server gekickt, wenn ich die Parse Methode aus der Handle() Methode aufrufe. Ich weiß nciht warum, ich gebe den Pointer ja eigentlich nur weiter und gebe ihn dann aus.
Mach ich die if Abfrage raus, geht es wunderbar. Muss also irgendwie an der parse geschichte liegen...
Achso, der Server basiert auf Threads. Jeder Client bekommt nen extra Thread.
Hoffe ihr könnt mir helfen..
-
debug mal diesen Abschnitt hier und sieh nach welchen Wert der text Parameter hat
void CClient::Parse(char *text) { if(strspn(text,"LOGIN") >= 0) { char *buf = text; Login(buf); } else if(strspn(text,"LOGOUT") >= 0) { this->Logout(); } }
-
wollte nur das kurz anhängen
int CClient::Parse(char *text) { //printf(text); char hs[10]; //s->Parse(text,Pa); //printf(Pa[0]); return 0; }Das merkwürdige.. schreibe ich nur ein printf(text); da hin, wird er ordnungsgemäß ausgegeben. Mach ich es aber so wie da oben, also ich allokiere mir eine char array [10]; dann wird mein client trotzdem gekickt. Der server läuft aber einwandfrei weiter, kann mich auch wieder verbinden. Ist doch sehr merkwürdig oder ??
[edit]
Hab das jetzt mal debugt und mir die Ausgabe von text und hs ausgeben. Hier gdb:
gdb) print text
$1 = 0x8052658 "LOGIN ba\r\n"
(gdb) print hs
$2 = "\n\000\000\000@¨\004\b1"Scheint ja soweit alles ok zu sein, oder ?
[/edit]
-
hat denn noch wer ne idee? Nur nen Ansatz würd ja evtl schon reichen.
-
So ich habs rausgefunden.
Der Fehler lag in der CSocket::Recv. Genaugenommen am char c; Hab vergessen es zu initialisieren, so wurde beim zweiten Aufruf der Methode Recv der variabel c die gleiche Speicherstelle zugewiesen, wie beim letzten aufruf, somit stand wieder \n drin. Dadurch wurd die while Schleife übersprungen und der Client ordnungsgemäß beendet