c++ socket server ohne zusätzlichen prozess verwalten.



  • habe mir eine kleine c++ socket library geschrieben um schnell nen server zu erstellen, der unter linux und windows laufen kann.
    der ausschnitt zeigt, dass die clients über select ausgewählt werden. HandleCLient() ist eine virtuelle funktion.
    Mein problem ist jetzt, dass der server noch über konsoleneingabe verwaltet werden müsste.
    ich möchte jedoch keinen thread dafür erstellen, da der code prinzipiell leicht portierbar sein sollte.
    nun ist die frage, ob das evtl auch ohne threads evtl mit select gehen könnte. mein gedanke wäre die tastatur als spezielles socket zu benutzen.

    void Server::ServerLoop() {
    	int iGreatestFD;
    	Socket SocketClient;
    
    	while(true) {
    		FD_ZERO(&m_ClientFDSet);
    		iGreatestFD = ServerCreateFDSet();
    
    		FD_SET(m_SocketServer, &m_ClientFDSet);
    		if(m_SocketServer > iGreatestFD) {
    			iGreatestFD = m_SocketServer;
    		}
    
    		select(iGreatestFD + 1, &m_ClientFDSet, NULL, NULL, NULL);
    
    		if(FD_ISSET(m_SocketServer, &m_ClientFDSet)) {
    			SocketClient = m_SocketServer.SocketAccepted();
    			ServerAddClient((int)SocketClient, SocketClient);
    		}
    		else {
    			for(std::list<ClientData>::iterator it = m_lClients.begin(); it != m_lClients.end(); it++) {
    				if(it->m_iFD == GetSendingClient()) {
    					SocketClient = it->m_SocketClient;
    				}
    			}
    
    			HandleClient(SocketClient);
    		}
    	}
    }
    


  • naja ich habs selber gemacht, falls einer mal in die verlegenheit kommen sollte:

    void Server::ServerLoop() {
    	int iGreatestFD;
    	Socket SocketClient;
    
    	ServerAddClient(STDIN_FILENO);
    
    	while(true) {
    		FD_ZERO(&m_ClientFDSet);
    		iGreatestFD = ServerCreateFDSet();
    
    		FD_SET(m_SocketServer, &m_ClientFDSet);
    		if(m_SocketServer > iGreatestFD) {
    			iGreatestFD = m_SocketServer;
    		}
    
    		select(iGreatestFD + 1, &m_ClientFDSet, NULL, NULL, NULL);
    
    		/*
    		 * neue clients
    		 */
    		if(FD_ISSET(m_SocketServer, &m_ClientFDSet)) {
    			SocketClient = m_SocketServer.SocketAccepted();
    			ServerAddClient(SocketClient);
    		}
    		/*
    		 * Tastatur
    		 */
    		else if(FD_ISSET(STDIN_FILENO, &m_ClientFDSet)) {
    			HandleServer();
    		}
    		/*
    		 * eingehende nachrichten
    		 */
    		else {
    			for(std::list<ClientData>::iterator it = m_lClients.begin(); it != m_lClients.end(); it++) {
    				if(it->m_SocketClient == GetSendingClient()) {
    					SocketClient = it->m_SocketClient;
    				}
    			}
    			HandleClient(SocketClient);
    		}
    	}
    }
    

Anmelden zum Antworten