Unendlich Sockets mit Multithreading



  • So, guten Tag.
    Ich bin gerade dabei einen Chat Server zu programmieren, der eine nicht begrenzte Anzahl an Clienten zulässt.
    Das klappt soweit auch sehr gut:

    // Hier wird der ganze Socket kram aufgerufen...
    //---
    while (1)   // Annehmen der Verbindungen
    	{
    		acceptSocket = SOCKET_ERROR;
    		cout << "Wartet auf einen neuen Client!\n";
    		acceptSocket = accept(mySocket, NULL, NULL);
    		if (acceptSocket == INVALID_SOCKET)
    		{
    			cout << "Fehler beim annehmen des Clienten!\n";
    		}
    		else
    			cout << "Neuer Client angenommen!\n";
    		DWORD ThreadID;
    		HANDLE hThread = CreateThread(0,0, ThreadServerFn, (LPVOID)acceptSocket, 0, &ThreadID);
    		CloseHandle(hThread);
    	}
    

    Soweit klappt alles super,
    aber wenn jetzt ein Client etwas an den Server sendet, wie kann ich dass dann an ALLE weiteren verbundenen Clienten schicken?

    meine Threadfunktion sieht wie folgt aus:

    // Gibt bisher leider nur die Empfangenen Zeichen auf der Serverkonsole aus
    DWORD WINAPI ThreadServerFn (LPVOID vpParam)
    {
    	SOCKET client = (SOCKET)vpParam;
    	char buf[256];
    	while (1)
    	{
    		int i = recv(client, buf, 256, 0);
    		if (i == SOCKET_ERROR)
    		{
    			break;
    		}
    		else
    		{
    			buf[i]='\0';
    
    			cout << buf << endl;
    		}
    	}
    	closesocket(client);
    	return 0;
    }
    

    Ich hoffe ich konnte mein Problem deutlich machen.
    Ich hab also keine Probleme mit dem jetzigen Programm, sondern mir fehlt lediglich ein Ansatz.



  • Halte dir eine Liste aller verbundenen Sockets.
    Wenn eine Meldung eintrifft, versendest Du an alle andern Sockets die empfangene Meldung.

    Simon



  • Ah,
    wunderbar, das war das Stichwort dass mir gehilfen hat! Danke!
    Hier noch ein kleines Tut zu verketteten Listen für Mitleidende:
    http://www.willemer.de/informatik/cpp/dynamic.htm



  • Es ist besser, die Funktionen und Datenstrukturen einer Bibliothek nachzunutzen, als etwas eigenes zu basteln. In C++ gibt es fuer verkettete Listen std::list.



  • Warum es sinn macht eine ganze weitere Bibliothek einzubinden, als schnell 3 Pointer zu erstellen ist mir schleierhaft. 😕
    Aber dennoch danke fpr den Tipp der vorgefertigten Liste, ich hab se eingebaut. 👍



  • Die Standard C++ Library sollte da schon dabei sein... die musst du nicht extra einbinden.

    🕶

    Simon


Anmelden zum Antworten