tsluga
23.04.2007, 18:42
Hallo,
ich habe ein Problem mit einem Netzwerkserver der mit Threads arbeitet und ich komme einfach nicht weiter.
Ich starte in einer Funktion ( mittels boost ) Threads
boost::thread client(boost::bind(&TupleSpace::dispatcher,this,client_socket));
In der Funktion dispatcher sollen die Threads Anfragen von clients behandeln, jedoch bekomme ich ( sobald er läuft in unregelmäßigen ) Abständen einen Speicherzugriffsfehler und ich finde den Fehler einfach nicht.
Funktion
void *dispatcher(const int client_socket){
// Kleine Textausgabe
PRINT_MSG("Boost Thread für Socket ("<<client_socket<<") läuft ");
while(true){
int r;
char buffer[128];
// Hier wird die Tuple größe empfangen
if((r = recv(client_socket,buffer,128-1,0)) > 0){
buffer[r] = '\0';
// zur Prüfung ob alles okay ist, schicke ich ein "OK" an den client
// zurück.
send(client_socket,"OK",strlen("OK"),0);
// Falls ein client ein quit geschickt hat, hat er seine arbeit beendet
// und der Thread kann ebenfalls seine Arbeit beenden
if(strcmp(buffer,"quit") == 0){
break;
}
else{
// Tuple ist eine eigene Klasse
Tuple tupleFromClient;
// einen Buffer anlegen mit der groesse die der Client
// im obigen recv() Befehl gesendet hat
char tupleBuffer[atoi(buffer)];
// Hier wird nun das serializierte Tuple Object empfangen
if(( r = recv(client_socket,tupleBuffer,atoi(buffer),0)) > 0){
tupleBuffer[r] = '\0';
std::stringstream stream;
stream<<tupleBuffer;
try{
// Hier wird nun aus dem empfangen char* string
// wieder ein Objekt gebastelt
boost::archive::text_iarchive ia(stream);
ia>>tupleFromClient;
send(client_socket,"Tuple OK",strlen("Tuple OK"),0);
}catch(std::exception &ex){
// Es kann sein, dass eine Exception geworfen wurde
// daher wird hier der Fehler ausgegeben
send(client_socket,"Tuple Error",strlen("Tuple Error"),0);
}
}
}
}
else{
break;
}
}
PRINT_MSG("Good bye client !");
close(client_socket);
return NULL;
}
Die müsste doch eigentlich Thread sicher sein, da hier nur lokale Variablen benutzt werden.
Allgemein :
Es ist die Implementierung einer Koordinationssprache es gibt einen Client und einen Server.
Server :
Speicher Tuple, die können z.B. so aussehen
Tuple("String",1,3.14);
Tuple(1,1);
Also eine beliebige länge und jedes Welt speichert einen beliebigen Typ ( in meinem Fall Objekte ).
Es ist viel zum erklären und ich hoffe man findet den Fehler auch so.
Als Anhang habe ich mal ein kleines Testprogramm ( Server + Client ) hochgeladen.
Benötigt werden :
- Boost Threads Lib
- Boost Serialization Lib
Wie gesagt, ich hoffe man findet den Fehler ohne große Erklärungen.
Gruß
PS : OS ist Linux ( Debian )
Nachtrag : Hat sich erledigt, lag an einer mitgelinkten LIB
ich habe ein Problem mit einem Netzwerkserver der mit Threads arbeitet und ich komme einfach nicht weiter.
Ich starte in einer Funktion ( mittels boost ) Threads
boost::thread client(boost::bind(&TupleSpace::dispatcher,this,client_socket));
In der Funktion dispatcher sollen die Threads Anfragen von clients behandeln, jedoch bekomme ich ( sobald er läuft in unregelmäßigen ) Abständen einen Speicherzugriffsfehler und ich finde den Fehler einfach nicht.
Funktion
void *dispatcher(const int client_socket){
// Kleine Textausgabe
PRINT_MSG("Boost Thread für Socket ("<<client_socket<<") läuft ");
while(true){
int r;
char buffer[128];
// Hier wird die Tuple größe empfangen
if((r = recv(client_socket,buffer,128-1,0)) > 0){
buffer[r] = '\0';
// zur Prüfung ob alles okay ist, schicke ich ein "OK" an den client
// zurück.
send(client_socket,"OK",strlen("OK"),0);
// Falls ein client ein quit geschickt hat, hat er seine arbeit beendet
// und der Thread kann ebenfalls seine Arbeit beenden
if(strcmp(buffer,"quit") == 0){
break;
}
else{
// Tuple ist eine eigene Klasse
Tuple tupleFromClient;
// einen Buffer anlegen mit der groesse die der Client
// im obigen recv() Befehl gesendet hat
char tupleBuffer[atoi(buffer)];
// Hier wird nun das serializierte Tuple Object empfangen
if(( r = recv(client_socket,tupleBuffer,atoi(buffer),0)) > 0){
tupleBuffer[r] = '\0';
std::stringstream stream;
stream<<tupleBuffer;
try{
// Hier wird nun aus dem empfangen char* string
// wieder ein Objekt gebastelt
boost::archive::text_iarchive ia(stream);
ia>>tupleFromClient;
send(client_socket,"Tuple OK",strlen("Tuple OK"),0);
}catch(std::exception &ex){
// Es kann sein, dass eine Exception geworfen wurde
// daher wird hier der Fehler ausgegeben
send(client_socket,"Tuple Error",strlen("Tuple Error"),0);
}
}
}
}
else{
break;
}
}
PRINT_MSG("Good bye client !");
close(client_socket);
return NULL;
}
Die müsste doch eigentlich Thread sicher sein, da hier nur lokale Variablen benutzt werden.
Allgemein :
Es ist die Implementierung einer Koordinationssprache es gibt einen Client und einen Server.
Server :
Speicher Tuple, die können z.B. so aussehen
Tuple("String",1,3.14);
Tuple(1,1);
Also eine beliebige länge und jedes Welt speichert einen beliebigen Typ ( in meinem Fall Objekte ).
Es ist viel zum erklären und ich hoffe man findet den Fehler auch so.
Als Anhang habe ich mal ein kleines Testprogramm ( Server + Client ) hochgeladen.
Benötigt werden :
- Boost Threads Lib
- Boost Serialization Lib
Wie gesagt, ich hoffe man findet den Fehler ohne große Erklärungen.
Gruß
PS : OS ist Linux ( Debian )
Nachtrag : Hat sich erledigt, lag an einer mitgelinkten LIB