Thread Problem
-
weiß keiner rat oder wurd der letzte post von mir übersehen??
wäre nett wenn ihr mir nochmal dabei helfen könntet.
-
poste nochmal den gesamten Code, so dass man ihn selbst kompilieren könnte und den verwendeten kompileraufruf.
-
also der ganze code sind insgesamt drei dateien...aber ich poste mal den code der main funktion...
void *WarteAufAnfrage(void *name) { //int i; sleep(10000); printf("%s",name); } int main(int argc, char *argv[]) { pthread_t WarteThread; //pthread_attr_t attr; //pthread_attr_init(&attr); //pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); pthread_create(&WarteThread,NULL,WarteAufAnfrage,(void *)"hallo"); pthread_join(WarteThread,NULL); CMySocket *pMySocket; pMySocket = new CMySocket; pMySocket->CreateServer(1500); int clients[10]; fd_set fdSet; int b; int rc; char *buffer; buffer = new char[1024]; for(b=0;b<10;b++) { clients[b]=0; } while(1) { FD_ZERO(&fdSet); FD_SET(pMySocket->ServerSocket,&fdSet); for(b=0;b<10;b++) { if(clients[b]!=0) { FD_SET(clients[b],&fdSet); } } select(11,&fdSet,NULL,NULL,NULL); if(FD_ISSET(pMySocket->ServerSocket,&fdSet)) { for(b=0;b<10;b++) { if(clients[b]==0) { clients[b]=accept(pMySocket->ServerSocket,NULL,NULL); printf("Neuer Client verbunden\n"); break; } } } for(b=0;b<10;b++) { if(clients[b]==0) { continue; } if(FD_ISSET(clients[b],&fdSet)) { buffer = new char[1024]; //buffer = pMySocket->SocketRecv(clients[b]); rc = recv(clients[b],buffer,1024,0); //rc = pMySocket->SocketRecv(clients[b]); printf("%s\n",buffer); if(rc<=0) { printf("Client %d hat die Verbindung beendet\n",b); close(clients[b]); clients[b]=0; FD_CLR(pMySocket->ServerSocket,&fdSet); delete [] buffer; } else { /* char *status,*game,*port,*map,*maxplayers,*servername; char *serveroption[5]; int a; ptr = strtok(buffer,"#"); status = ptr; for(a=0;a<5;a++) { ptr = strtok(NULL,"#"); serveroption[a] = ptr; } game = serveroption[0]; servername = serveroption[1]; port = serveroption[2]; map = serveroption[3]; maxplayers = serveroption[4]; printf("%s..%s...%s...%s..%s\n",game,servername,port,map,maxplayers); if(strcmp(status,"01")==0) // Server starten { if(strcmp(game,"01")==0) //CS 1.5 Server { if(openCounterStrikeServer15(port,map,maxplayers,servername)==1) { printf("CS Server gestartet\n"); send(clients[b],"01\0",10,0); } else { printf("Fehler beim starten des CS Servers\n"); send(clients[b],"00\0",10,0); } } } delete [] buffer;*/ } } } } }
in den zwei anderen dateien ist die klasse mysocket deklariert...
theoretisch müsste ja ein hallo ausgegeben werden, nur leider wird es das nicht... der rest des programms geht auch nicht... d.h. es kann sich kein client übers netzwerk im server einloggen. Also so als wenn der Thread alles blockt und sich das programm "aufhängt"
-
Der folgende Code funktioniert hier:
extern "C" { #include <pthread.h> #include <unistd.h> } #include <cstdio> void *WarteAufAnfrage(void *name) { //int i; sleep(10); printf("%s\n",name); } int main(int argc, char *argv[]) { pthread_t WarteThread; //pthread_attr_t attr; //pthread_attr_init(&attr); //pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); pthread_create(&WarteThread,NULL,WarteAufAnfrage,(void *)"hallo"); pthread_join(WarteThread,NULL); }
sleep nimmt die anzahl der sekunden und nicht der milisekunden.
Das ganze habe ich mit
g++ -pthread datei.C
kompiliert.
Geh mal in das src verzeichnis und mach ein "make". Dann siehst du was der kompiler wirklich ausfuehrt. ansonsten kannst du im irc nochmal fragen. zum beispiel #c++.de ueber irc.fu-berlin.de
-
Bist Du sicher das accept mit NULL,NULL geht?
snoopdog schrieb:
clients[b]=accept(pMySocket->ServerSocket,NULL,NULL);
Sollte das nicht so:
socklen_t len=(socklen_t)sizeof(newConnection.addr); newConnection.socket=accept(acceptSocket,(struct sockaddr*)&newConnection.addr,&len);
aussehen?
Und ich glaube ich habe das selbe Tutorial zur Socketprogrammierung benutzt wie du..:-) ; mein Code sieht fast genauso aus.
Gruß
Michael