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