Client-Server-Programmierung mit 2 Clients gleichzeitig



  • Hallo Leute,

    ich brauch mal wieder euren Rat, da ich gerade etwas auf dem Schlauch stehe 🙂

    Ich habe ein Client-Server-Programm, was auch gut funktioniert - allerdings für exakt einen Client.

    Jetzt sollen sich zwei Clients verbinden können, welchen ich dann zyklisch Nachrichten schicken kann.

    Wie mach ich das am schlausten ?
    Meine Sockets sind global, da ich sie überall im Programm steuern und beenden können muss.

    extern Reader_Socket	socket_Class;
    
    void AcceptThread(){
    
    		if (listen(socket_Class.Get_ServerSocket() , 2) == -1 ) {		
    				syslog( LOG_INFO, "listen failed");
    				exit(-1); 
    		}	
    
    		// wait for connection to clients
    		while (1) {		
    
    			syslog( LOG_INFO, "wait for connection to client");		
    
    			struct sockaddr_in ClientAddr = { 0 };
    			socklen_t clientLen = sizeof(ClientAddr);
    
    	     	int new_socket = accept ( socket_Class.Get_ServerSocket() , (struct sockaddr *) &ClientAddr , &clientLen );
    
    	     	if ( !(new_socket > 0) ) {
    	     		syslog( LOG_INFO, "accept failed");
    	      	break; 
    	      }
    	      else {        
    		      for ( int i = 0; i < 2; i++){
    		      		socket_Class.Set_ClientSocket(new_socket,i);
    		      		syslog( LOG_INFO, "Client '%d' is connected!" _ i);    
    		      }
    
    	      reader_run(); // start 
    
    		} // end while
    }
    

    aber brauch ich dann nicht zwei while-schleifen ?
    Die Funktion reader_run() soll ja erst aufgerufen werden, wenn beide Clients verbunden sind 😕
    ich bin gerade verwirrt und ich hoffe, ihr könnt mir helfen 🙄



  • C++_Newbie schrieb:

    Meine Sockets sind global, da ich sie überall im Programm steuern und beenden können muss.

    Dann hast du jetzt ja festgestellt, dass all die, die vor globalen Variablen warnen, recht haben.

    Du musst erkennen, dass etwas auf einem Socket gesendet wird und die Daten abarbeiten. Dazu kannst du Threads und/oder Systemfunktionen wie select/poll verwenden. Oder du benutzt direkt eine Bibliothek, z.B. boost::asio. Auch Qt bietet entsprechendes.

    Allerdings ist das Ganze kein C++-Problem => falsches Forum


Anmelden zum Antworten