Server schließt sich nach client beendet #2



  • Hi,
    hatte letztens schonma das Problem, nur jetzt hat sich das Problem wieder aufgetan.

    der Code:

    char *buffer;
    
    	buffer = new char[1024];
    	int status;
    
    	char *ptr;
    	char *puffer;
    
    	PrintLog("Servermanager einwandfrei gestartet");
    
    	while(1)
    	{
    		if((client = accept(fromsocket, NULL, NULL)) == -1)
    		{
    			PrintLog("Konnte den Socket nicht auf accept setzen");
    		}
    		else
    		{
    			status = 1;
    		}
    
    		while(status == 1)
    		{
    
    			if((recv(client,buffer,1024,0))!=0)
    			{
    				printf("%s\n",buffer);
    				puffer = buffer;
    				ptr = strtok(buffer,"#");
    
    					if(strcmp(ptr,"01")==0) // Counter Strike 1.5
    					{
    						printf("CS\n");
    
    						counterstrike15 cs15;
    						ptr = strtok(NULL,"#");
    						if(strcmp(ptr,"01")==0)
    						{
    							printf("HaVoc Server #1\n");
    							cs15.Servername = 01;
    
    						}
    						else if(strcmp(ptr,"02")==0)
    						{
    							printf("HaVoc Server #2\n");
    							cs15.Servername = 02;
    						}
    					}
    					else if(strcmp(ptr,"02")==0)
    					{
    						printf("CS 16\n");
    					}
    
    			}
    			else
    			{
    				status = 0;
    			}
    		}
    
    	}
    

    so sobald ich etwas zum client gesendet hate und danach die verbindung beende, beendet sich auch mein server... 😞
    wie kann ich das verhindern ?? außerdem wird das was zuletzt gesendet wurde nochmal ausgeben.

    Servermanager ist gestartet
    01#01#27015#01#10#
    CS
    HaVoc Server #1
    01
    CS
    Betätigen Sie die Eingabetaste, um fortzufahren!
    

    nachdem havoc server #1 ausgegeen wurde hab ich den client beendet
    hoffe ihr könnt mir helfen



  • snoopdog schrieb:

    if((recv(client,buffer,1024,0))!=0)
    

    recv gibt -1 bei einem fehler zurueck. das ist z.b. dann der fall, wenn
    der socket nicht mehr verbunden ist (client hat socket geschlossen).

    strtok kann auch einen 0 zeiger zurueckliefern.

    bau mal eine fehlerbehandlung ein, dann kannst du einer vielzahl von
    undefinierten vorgaengen vorbeugen.



  • ich habe den ganzen code jetzt umgearbeitet und auf die select methode umgestellt, doch leider das gleiche Problem.

    nehme ich die ifabfragen unten raus, kann ich ohne probleme mich verbinden sachen zum server senden die verbindung beenden mich später wieder anmelden und wieder daten senden, nur wenn diese if abfragen drin sind klappt das nicht, wie kann ich das anders lösen?

    for(b=0;b<10;b++)
    	{
    		clients[b]=0;
    	}
    	while(1)
    	{
    		FD_ZERO(&fdSet);
    		FD_SET(fromsocket,&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(fromsocket,&fdSet))
    		{
    			for(b=0;b<10;b++)
    			{
    				if(clients[b]==0)
    				{
    					clients[b]=accept(fromsocket,NULL,NULL);
    					printf("Neuer Client verbunden");
    					break;
    				}
    			}
    		}
    
    		for(b=0;b<10;b++)
    		{
    			if(clients[b]==0)
    			{
    				continue;
    			}
    			if(FD_ISSET(clients[b],&fdSet))
    			{
    				rc = recv(clients[b],buffer,1024,0);
    				if(rc==0)
    				{
    					printf("Client %d hat die Verbindung beendet\n",b);
    					close(clients[b]);
    					clients[b]=0;
    				}
    				else
    				{
    					ptr=strtok(buffer,"#");
    					if(strcmp(ptr,"01")==0)
    					{
    						printf("CS Server 1.5\n");
    						ptr = strtok(NULL,"#");
    						if(strcmp(ptr,"01")==0)
    						{
    							printf("HaVoc Server #1\n");
    						}
    						else
    						{	printf("anderer server\n");
    						}
    					}
    				}
    			}
    		}
    	}
    

    das kann doch echt nicht war sein, das liegt auf jedenfall an den ifabfragen bzw den strtoken also dem auseinander nehmen des strings der vom client kommt



  • nochmal: strtok kann 0 liefern. uebergibst du 0 an strcmp passiert IRGENDWAS 🙂

    und das strtok(NULL,'#')... hm das kann nich gehen.

    poste mal ein compilierbares beispiel dann laesst sich exakt sagen wo
    der fehler ist.



  • hier ist zwar noch viel müll mit drin was ich noch aufräumen muss, aber im enteffekt läuft es.

    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif
    
    #include <iostream>
    #include <cstdlib>
    #include <stdio.h>
    #include <unistd.h>
    #include <syslog.h>
    #include <sys/types.h>
    #include<netinet/in.h>
    #include <string.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<sys/select.h>
    #include <time.h>
    
    #define CHILD 0
    #define ERROR -1
    #define CONFIG_PATH /usr/local/games/servermanager_gameserver/servermanager.conf
    #define SERVER_PORT	1500 	/* Ein Port der auch von 'gewöhnlichen' Benutzern verwendet werden darf */
    #define MSG_SIZE	128		/* Die maximale Anzahl an Zeichen, die 'msg' enhalten darf */
    
    #define MAX_CLIENTS 10
    char logpath[200];
    
    struct counterstrike15
    {
    	int Port;
    	int Map;
    	int Servername;
    };
    
    void OpenConfig()
    {
    	FILE *config;
    
    	config = fopen("/usr/local/games/servermanager_gameserver/servermanager.conf","r");
    
    	fscanf(config,"#LOGFILE:%s\n",logpath);
    	fclose(config);
    }
    
    void PrintLog(char *Log)
    {
    	FILE *LogFile;
    	LogFile = fopen(logpath,"a");
    
    	time_t zeit;
    	time(&zeit);
    
    	fprintf(LogFile,"%s : %s\n",Log,asctime(localtime(&zeit)));
    	fclose(LogFile);
    }
    
    void start_daemon(char *log_name,int facility)
    {
    	int i;
    	pid_t pid;
    
    	if((pid = fork()) != CHILD) exit(0);
    
    	if(setsid() == ERROR)
    	{
    		fprintf(stderr,"%s kann nicht Sessionführer werden!",log_name);
    		exit(0);
    	}
    	//chdir("/");
    	//umask(0);
    	//for(i=sysconf(_SC_OPEN_MAX);i>0;i--)
    	//close(i);
    
    	//openlog(log_name,LOG_PID,facility);
    
    	PrintLog("Daemon gestartet");
    }
    
    int main(int argc, char *argv[])
    {
    	printf("Servermanager ist gestartet\n");
    	OpenConfig();
    	//start_daemon("ServerManager",0);
    
    	PrintLog("Servermanager ist gestartet");
    
    	int fromsocket; /* Socket, der auf ankommende Anfragen wartet */
    	int client; /* Socket für die Kommunikation mit einem Client */
    	struct sockaddr_in fromaddr; /* Adresse die 'belauscht' werden soll */
    	char msg[MSG_SIZE]; /* der Buffer für die Nachrichten */
    	char help[MSG_SIZE] = "Hallo "; /* Hilfsvariable */
    	int bytes; /* hier wird die Anzahl der gelesenen Bytes gespeichert */
    
    	int clients[10];
    	fd_set fdSet;
    
    	/* Socket erzeugen; verbindungsorientiert mit TCP */
    	fromsocket = socket(PF_INET,SOCK_STREAM,0);
    	if(fromsocket == -1){
    		PrintLog("Konnte den Socket nicht erstellen");
    
    	}
    
    	/* Adresse zum 'Lauschen' definieren */
    	fromaddr.sin_family = PF_INET;
    	fromaddr.sin_addr.s_addr =  htonl(INADDR_ANY); /* eine Anfrage kann von jeder IPAdresse kommen */
    	fromaddr.sin_port = htons(SERVER_PORT);
    	if(bind(fromsocket, (struct sockaddr *)&fromaddr, sizeof(fromaddr)) == -1){
    	PrintLog("Kann den Socket nicht binden");
    
    	}
    	/* Socket 'horchen' lassen; die maximale Länge der Warteschlange wird auf 3 gesetzt */
    
    	if(listen(fromsocket, 3) == -1){
    		PrintLog("Konnte den Socket nicht listen");
    
    	}
    
    	char *buffer;
    
    	buffer = new char[1024];
    	int status;
    
    	char *ptr;
    	char *puffer;
    	int rval;
    	int b;
    	int rc;
    
    	PrintLog("Servermanager einwandfrei gestartet");
    
    	for(b=0;b<10;b++)
    	{
    		clients[b]=0;
    	}
    	while(1)
    	{
    		FD_ZERO(&fdSet);
    		FD_SET(fromsocket,&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(fromsocket,&fdSet))
    		{
    			for(b=0;b<10;b++)
    			{
    				if(clients[b]==0)
    				{
    					clients[b]=accept(fromsocket,NULL,NULL);
    					printf("Neuer Client verbunden");
    					break;
    				}
    			}
    		}
    
    		for(b=0;b<10;b++)
    		{
    			if(clients[b]==0)
    			{
    				continue;
    			}
    			if(FD_ISSET(clients[b],&fdSet))
    			{
    				rc = recv(clients[b],buffer,1024,0);
    				if(rc==0)
    				{
    					printf("Client %d hat die Verbindung beendet\n",b);
    					close(clients[b]);
    					clients[b]=0;
    				}
    				else
    				{
    					ptr=strtok(buffer,"#");
    					if(strcmp(ptr,"01")==0)
    					{
    						printf("CS Server 1.5\n");
    						ptr = strtok(NULL,"#");
    						if(strcmp(ptr,"01")==0)
    						{
    							printf("HaVoc Server #1\n");
    						}
    						else
    						{	
    							printf("anderer server\n");
    						}
    					}
    				}
    			}
    		}
    	}
    }
    

    hoffe du kannst mir nun sagen wo der fehler liegt.


Log in to reply