Thread Problem



  • kannst du mir sagen wie ich mit gcc mehrere cpp und header dateien compiliere ? oder muss ich mir erst ne makedatei erstellen ?? hab bisher immer mit kdevelop gearbeitet



  • Du kannst das natürlich auch über einzelne gcc-Aufrufe machen, dass ist aber natürlich aufwendig.

    Eine Makefile musst du nicht unbedingt schreiben, dafür gibt es die ultimative Makefile, die du nur noch ein wenig anpassen musst.



  • habe grade etwas ausprobiert.. ein neues Projekt erstellt was nur nen hallo ausgibt... die biblotheken bei kdevelop eingebunden und es klappt einwandfrei...

    das gleiche bei meinem projekt getan und es klappt nichts, hier mal die komplette Fehlermeldung.

    /bin/sh: line 1: 22915 Speicherzugriffsfehler ./gameservermanager
    Betätigen Sie die Eingabetaste, um fortzufahren!



  • z.B.
    g++ -I/include -L/libs -lpthread /src/foo.cpp /usr/include/bar.cpp -o TestProgramm

    Michael



  • so also ich habe es grade irgendwie hinbekommen das ich keinen Speicherzugriffsfehler mehr habe. weiß aber nicht genau wieso... aber es klappt, das komische ist nur da nix ausgeben wird...

    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)
    

    so er müsste ja jetzt 10 sekunden warten bis er was ausgibt...

    habe die zeit mal genutzt und mir alle prozesse angezeigt mit ps aux..
    da wa einmal ./gameserver und nochmal ./gameserver ; echo"Bestätigen mit Taste..."

    also so als wenn der Thread sich sofort beendet...



  • 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


Anmelden zum Antworten