Hallo
Ich habe vor für ein Abschlussprojekt in C++ ein kleines Chatprogramm zuu programmieren. Mit den Netzwerk und den Sockets komme ich nung gut klar. Allerdings hab ich nund as Problem das einige Anweisungen sogenantne blockierende Verbindungen sind. Da ich nun mehrere solcher Funktionen in verschiedenen Klassen hab, woltle ich dieses Problem nun mit Threads umgehen.
Nun soll das eigentliche Programm, welches in keinem Thread verpackt ist und die in den Objekten enthaltenden Threads laufen.
Zunächst hab ich mir eine Methode zum erstellen von Threads geschrieben:
Und nun starte ich Besipeilsweise einen Thread aufm Server (der Thread der zum abhöhren neuer Verbindugnen zuständig ist)
Wobei thread vom Typ HANDLE ist und clientenAkzeptieren() wie folgt aussieht:
In eingehden Verbindungen wird die Accept Methoide aufgerufen, welche selber nun die eigentliche blockierende Methode darstellt:
Zunächsteinmal scheinen die Methoden wie gewollt zu laufen, ich kann beliebig viele Testclienten starten und alle zeigen mit an das sie verbunden sind (weitere Funktionen hab ich noch nicht eingebaut, ausser das sie auch anzeigen können, wenn sich nicht verbunden sind ;-))
Und nun zu meinem Problem:
Auch wenn es sich hierbei um Threads handelt, scheinen diese jedoch weiterhin zu blockieren. Weitere Anweisungen wie zum Beispiel ein cout werden nicht ausgeführt.
Ich selber hab schon mal ein ähnliches Projekt unter Java programmiert, hab also von daher ein paar Kenntnisse zur Thread- und Socketprogrammierung.
Zudem sollen wir Visual Studio 2005 benutzen ohne weitere (externe) Bibilotheken etc. zu verwenden.
Ich habe vor für ein Abschlussprojekt in C++ ein kleines Chatprogramm zuu programmieren. Mit den Netzwerk und den Sockets komme ich nung gut klar. Allerdings hab ich nund as Problem das einige Anweisungen sogenantne blockierende Verbindungen sind. Da ich nun mehrere solcher Funktionen in verschiedenen Klassen hab, woltle ich dieses Problem nun mit Threads umgehen.
Nun soll das eigentliche Programm, welches in keinem Thread verpackt ist und die in den Objekten enthaltenden Threads laufen.
Zunächst hab ich mir eine Methode zum erstellen von Threads geschrieben:
Code:
HANDLE threadErstellen(LPTHREAD_START_ROUTINE prozedur, bool bSofortStarten, LPDWORD& id)
{
//Überprüfung ob der Thread sofort starten soll
DWORD start = 0;
if (!bSofortStarten)
{
start = CREATE_SUSPENDED;
}
/* Thread erzeugen:
* 1. Parameter: Sicherheitsattribut, gleiches Sicherheitsprofil, wie die Anwendung
* 2. Parameter: Stackgröße
* 3. Parameter: Funktionsaufruf
* 4. Parameter: Paramterübergabe an die Funktion
* 5. Parameter: Abfrage ob der Thread gestartet erzeugt werden soll
* 6. Parameter: Verweis auf die Thread ID
*/
return CreateThread(NULL, 0, prozedur, 0, start, id);
}
Und nun starte ich Besipeilsweise einen Thread aufm Server (der Thread der zum abhöhren neuer Verbindugnen zuständig ist)
Code:
thread = threadErstellen((LPTHREAD_START_ROUTINE)clientenAkzeptieren(), true, threadID);
Wobei thread vom Typ HANDLE ist und clientenAkzeptieren() wie folgt aussieht:
Code:
DWORD WINAPI ServerNetzwerk::clientenAkzeptieren()
{
while(true)
{
SOCKET* pClientSocket = new SOCKET();
// Versertzt den Socket in nem Listen-Status
hoehren(this->serverSocket, 1);
//Verbindung annehmen
eingehendeVerbindung(*pClientSocket, this->serverSocket);
}
return 0;
}
In eingehden Verbindungen wird die Accept Methoide aufgerufen, welche selber nun die eigentliche blockierende Methode darstellt:
Code:
string eingehendeVerbindung(SOCKET& rClientSocket, SOCKET& rServerSocket)
{
//Akzeptieren von Verbindungen (Blockierende Methode)
//2. Argument: Optionale Angabe zu der Adresse des Clients
//3. Argument: Länge der Adresse
rClientSocket=accept(rServerSocket,NULL,NULL);
//Stauts Rückgabe
string sRueckgabe;
if(rClientSocket==INVALID_SOCKET)
{
sRueckgabe = "Fehler: accept, Fehlercode: ";
char sFehlercode[10];
itoa(WSAGetLastError(), sFehlercode, 10);
sRueckgabe.append(sFehlercode);
}
else
{
sRueckgabe = "Neue Verbindung wurde akzeptiert!";
}
return sRueckgabe;
}
Zunächsteinmal scheinen die Methoden wie gewollt zu laufen, ich kann beliebig viele Testclienten starten und alle zeigen mit an das sie verbunden sind (weitere Funktionen hab ich noch nicht eingebaut, ausser das sie auch anzeigen können, wenn sich nicht verbunden sind ;-))
Und nun zu meinem Problem:
Auch wenn es sich hierbei um Threads handelt, scheinen diese jedoch weiterhin zu blockieren. Weitere Anweisungen wie zum Beispiel ein cout werden nicht ausgeführt.
Ich selber hab schon mal ein ähnliches Projekt unter Java programmiert, hab also von daher ein paar Kenntnisse zur Thread- und Socketprogrammierung.
Zudem sollen wir Visual Studio 2005 benutzen ohne weitere (externe) Bibilotheken etc. zu verwenden.