Marscel
2006-01-18, 16:56:06
Ich bin gerade dabei, meine C++ Kenntnisse an einem winzigen Server-Programm (bisweilen Windows mit winsock.h) zu testen: Das Ding soll einen Clienten verbinden lassen und solange wie der Client verbunden ist, Rohdaten annehmen lassen, diese weiterverarbeiten und dann eine Bestätigung schicken an den Clienten, dass alles hingehauen hat.
do
{
if(client = accept(server, (struct sockaddr*)&from, &from_len))
{
// char * messages[] = { "Bla", ... };
send(client, messages[0], strlen(messages[0]), 0);
}
} while(1);
Das funktioniert auch alles gut, der Server nimmt mehrere Verbindungen an. Meine Fragen:
1.) Wie kann man den Server dazu bestimmen, auch ähnlich auf Datenempfang zu reagieren?
Wenn ich das in die Schleife darunter setze, funktioniert das nicht wie gewünscht, sondern nur exakt einmal (obwohl es in einer endlosen do-Schleife ist):
if(recv(client, temp, sizeof(temp), MSG_PEEK))
{
send(client, messages[1], strlen(messages[1]), 0);
}
2.) Es wird immer dasselbe struct vom Typ SOCKET benutzt, nämlich 'client', das wird doch immer wieder überschrieben (da Rückgabewert von accept), wenn ein neuer Client verbindet, oder?
Geht das überhaupt, dass mehrere Clienten auf einmal verbunden sind? Oder sollte man die Clienten in einem Container speichern oder ist das gar nicht nötig?
3.) Wie kann man prüfen, ob der Client die Verbindung geschlossen hat (Terminierungssymbol oder so...) ?
4.) Wie kann man identifizieren, von welchem Clienten die gesendeten Daten stammen? Den Socket weiß ich ja, 'client', aber gibt/schreibt recv() irgendwas an Infos, z.B. dessen Addresse?
Damals bei PureBasic (nicht lachen), gabs einfach eine Funktion, die ständig den Socket auf Aktivitäten überwachte und per case-Zweig handelte, z.B. Client sendet, Client schließt Verbindung etc.
do
{
if(client = accept(server, (struct sockaddr*)&from, &from_len))
{
// char * messages[] = { "Bla", ... };
send(client, messages[0], strlen(messages[0]), 0);
}
} while(1);
Das funktioniert auch alles gut, der Server nimmt mehrere Verbindungen an. Meine Fragen:
1.) Wie kann man den Server dazu bestimmen, auch ähnlich auf Datenempfang zu reagieren?
Wenn ich das in die Schleife darunter setze, funktioniert das nicht wie gewünscht, sondern nur exakt einmal (obwohl es in einer endlosen do-Schleife ist):
if(recv(client, temp, sizeof(temp), MSG_PEEK))
{
send(client, messages[1], strlen(messages[1]), 0);
}
2.) Es wird immer dasselbe struct vom Typ SOCKET benutzt, nämlich 'client', das wird doch immer wieder überschrieben (da Rückgabewert von accept), wenn ein neuer Client verbindet, oder?
Geht das überhaupt, dass mehrere Clienten auf einmal verbunden sind? Oder sollte man die Clienten in einem Container speichern oder ist das gar nicht nötig?
3.) Wie kann man prüfen, ob der Client die Verbindung geschlossen hat (Terminierungssymbol oder so...) ?
4.) Wie kann man identifizieren, von welchem Clienten die gesendeten Daten stammen? Den Socket weiß ich ja, 'client', aber gibt/schreibt recv() irgendwas an Infos, z.B. dessen Addresse?
Damals bei PureBasic (nicht lachen), gabs einfach eine Funktion, die ständig den Socket auf Aktivitäten überwachte und per case-Zweig handelte, z.B. Client sendet, Client schließt Verbindung etc.