Server wird beendet nachdem Client sich abgemeldet hat



  • Guten Morgen,
    habe ein Problem, ich habe einen Server der unter Linux läuft und der wartet darauf das sich Clients mit ihm verbinden. So das verbinden funktioniert ja auch einwandfrei, doch nun das Problem. Nachdem sich der Client verbunden hat und irgendwas gemacht hat. Ganz egal was, möchte man sich ja auch wieder vom Server verabschieden. So nur wenn ich den Client disconnecte, schließt sich auch mein Server. Wie kann ich es machen, das der Server permanent offen bleibt, bis man ihm ausdrücklich sagt er soll sich beenden.
    Hier ist der code von meinem bissherigen "Server".

    int main(int argc, char *argv[])
    {
    	printf("Servermanager ist gestartet\n");
    	OpenConfig();
    	//start_daemon("ServerManager",0);
    
    	PrintLog("Servermanager ist gestartet\n");
    	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 */
    
    	/* Socket erzeugen; verbindungsorientiert mit TCP */
    	fromsocket = socket(PF_INET,SOCK_STREAM,0);
    	if(fromsocket == -1){
    		PrintLog("Konnte den Socket nicht erstellen\n");
    
    	}
    
    	/* 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);
    
    	while(1)
    	{
    		if(bind(fromsocket, (struct sockaddr *)&fromaddr, sizeof(fromaddr)) == -1){
    		PrintLog("Kann den Socket nicht binden\n");
    
    		}
    	/* Socket 'horchen' lassen; die maximale Länge der Warteschlange wird auf 3 gesetzt */
    		if(listen(fromsocket, 3) == -1){
    			PrintLog("Konnte den Socket nicht listen\n");
    
    		}
    		if((client = accept(fromsocket, NULL, NULL)) == -1){
    			PrintLog("Konnte den Socket nicht auf accept setzen\n");
    		}
    
    		PrintLog("Servermanager einwandfrei gestartet\n");
    
    		char buffer[1024];
    		int i =1;
    	/* Auf Anfragen warten */
    		while(1)
    		{ /* Endlosschleife; "forever" */
    		/* Socket für ankommende Anfrage erzeugen */
    			int rc1;
    			if(i==1)
    			{		
    				rc1 = recv(client,buffer,1000,0);
    				char *puffer;
    				puffer = new char[1024];
    				puffer = strtok(buffer,":");
    				if(rc1 == 0)
    				{
    					PrintLog("Client hat die Verbindung beendet\n");
    					i = 0;
    				}
    
    				if(strcmp(puffer,"counter-strike")==0)
    				{
    					system("/home/wendrich/remoteserver/startcs start");
    				}
    			}
    		}
    	}
    
      return EXIT_SUCCESS;
    }
    

    hoffe ihr wisst was ich meine und könnt mir helfen.



  • bind und listen darfst du nur einmal aufrufen. danach ist fromsocket
    in der lage mit accept verbindungen anzunehemen.

    du allokierst speicher fuer puffer mit new aber das passende delete fehlt.
    du weist, das strtok 0 zurueckliefern kann? vielleicht fliegt dein server
    auch da raus (strcmp(strtok-ergebnis,"..."))...?


Anmelden zum Antworten