Archiv verlassen und diese Seite im Standarddesign anzeigen : server und threads
Mein server schickt an ca. 40 Clients eine Message.
ich pro client einen thread aufmachen, muss ich ja, denn es kann ja sein dass ein client down ist, und dieser würden den ganzen verkehr aufhalten.
Daher lasse ich durch eine for Schleife pro Durchlauf einen neuen Thread erstellen und überge diesen die Funktion Connecten, in welcher dann versucht wird zum Client zu connecten. Jedes Connecten connectet zu einer anderen IP.
Mein Problem ist, dass die Threads sich nicht beenden, bzw. dass es sehr lange dauert?
anda_skoa
12-09-2002, 11:24
EIn Server connectet zu den Clients?
Sollte das nicht anders rum sein?
Die Clients connecten zum Server?
Vielleicht beschreibst du mal, was das System ansich machen soll.
Könnte sein, dass jemadn eine andere Idee hat, die sich leichter implementieren läßt.
Ciao,
_
ja war natürlich fehler, im server ist eine client applikation implementiert, die dann zu den einzelnen clients connected.
Und da wird eben pro Client ein Thread aufgemacht, muss denn wenn ich die Nachricht nacheinander zu jedem einzelnen Client schicke, und ein Client down ist, würde sich der ganze Verkehr verzögern.
Natürlich ließen sich auch soviel Prozesse wie aufmachen, allerdings sind Prozesse resourcenbelastender und es ist meiner Meinung nach schwieriger umzusetzen, denn wie soll ich mit einer for-schleife Prozesse erstellen...und gleichzeitig jedem erstellten Prozess eine Fkt übergen bzw. ausführen lassen.
Mein System besteht aus einem Server und mehrere Clients, dabei soll jeder Client an denServer Text senden können, der Server sendet den empfangen text dann wieder an alle Clients zurück!
Das funktioniert auch alles prächtig, allerdings besteht der Server momentan aus noch einen Prozess, und so wird da früher oder später zu Konflikten kommen, wobei es insgesamt nur 10 Cleints sind, d.h. der Verkehr ist nicht soo hoch! Trotzdem sollte der server meiner Meinung nach in einzelne Threads oder Prozesse zerlegt werden.
anda_skoa
12-09-2002, 11:50
Mal sehen ob ich das richtig verstanden habe.
Der Server läuft.
Eine beliebige Anzahl Clients connected zum Server.
Jeder Client kann Text an den Server senden.
Wenn der Server so einen Text empfängt, schickt er ihn an alle anderen Clients weiter.
Praktisch wie ein Chatserver.
War das soweit richtig?
Ciao,
_
jo :)
wie gesagt läuft alles optimal, nur dass der server momentan auf noch einen prozess basiert.
Zwar ist das meiner Meinung nach nich weiterschlimm, denn das System kommt in den Einsatz mit nur 10 Cleints, und diese Rechner laufen rund um die Uhr, d.h. es würde sich keine Wartezeit bilden, weil der server auf connect wartet.
anda_skoa
12-09-2002, 11:59
Ich denke du denkst zu kompliziert :)
Wenn die Clients zum Server connecten, braucht der Server ja nicht zurück connecten.
Oder denke ich zu einfach?
Ciao,
_
hm ich erklär mal alles:
Server wartet auf connect von client1.
client 1 connectet zu server, und sendet nachricht.
Server empfängt Nachricht erstellt neuen Socket, connectet nacheinander zu allen 10 Clients und sendet Befehl.
Das läuft auf dem Server alles nacheinander ab.
So läuft das ab!
Die Client Zahl ist fest und bekannt (10 Stk.).
anda_skoa
12-09-2002, 12:13
Hmm, warum disconnected der Client, nachdem er die Message geschickt hat?
Ist das so vorgegeben, ich meine, sind die clients schon vorhanden?
Denn es macht die Sache nur unnötig komplizier:
- der server muß auch client sein
- der client muß auch server sein.
Oder kannst du da noch was machen?
Ciao,
_
der client disconnectet deswegen, dass andere clients connecten können, wenn der client immer mit dem server verbunden wäre, müsste ich ja auf dem server 10 ports aufmachen, also für jeden client einen port, damit dieser stets mit dem server verbunden ist!
anda_skoa
12-09-2002, 12:28
jein.
Du kannst beliebig (=durch das system begrenzt) viele Connects an einem port empfangen.
Wenn du eine Server amchst, hast du irgendwo einen Socket, der auf einen Port mit bind gebunden wurde und dann wartest du mit accept() auf connects (kann auch bischen anders sein, ich hab das mit C noch nie gemacht)
Der accept() lieftert dann einen Socket (in C wahrscheinlich einen Filedescriptor).
Dieser Socket ist unabhängig vom Socket, der mit accept() auf connects wartet, d.h. du kannst weiter mit accept auf neue Connects warten ohne dass die Verbindung zum Client geschlossen werden muß.
Pseudo code
while (1)
{
int clientSocket = accept(serverSocket, NULL, 0);
handleClient(clientSocket);
}
Wenn handleClient nicht blockiert, zb weil es einen Thread startet, dann wartet der Server Process hautpthread sofort wieder auf weitere Connects, während der Client von einem anderen Thread bedient wird.
handleClient könnte in etwa so aussehen:
void handleClient(int socket)
{
struct ClientData* clientData = malloc(sizeof(ClientData));
clientData->socket = socket;
// erzeuge thread mit client_handler als funktion und clientData als parameter
}
void client_handler(void* data)
{
struct ClientData* clientData = (ClientData*) data;
// work on clientData->socket
}
Ciao,
_
hmpf, das wirft jetzt natürlich mein ganzes konzept um!
werd mal schauen das ganze sollte nämlich bis sonntag fertig sein .... aber es spricht doch auch nichts dagegen immer wieder frisch connecten zu lassen....
anda_skoa
12-09-2002, 13:02
Es geht natürlich schon, aber es macht Server und Client unnötig kompliziert.
Vorallem beim Client ersparst dur dir viel Arbeit, wenn er nur aktiv connectet.
Und der Server hat kein Problem, falls ein Client down ist, weil er ohenhin nur verbundene Clients bedient.
Praktisch alle Server/Client Systeme funktionieren so.
Vorallem in Zeiten von Firewalls ist es manchmal gar nciht möglich, vom Server zum Client zu connecten.
Ciao,
_
hm aber der server müsste deswegen trotzdem noch in einzelne threads zerlegt werden, oder meinst du das ist gar nicht nötig bei nur 10 clients, wo der verkehr nicht allzu hoch sein wird
anda_skoa
12-09-2002, 13:11
Theoretisch kannst du mir select() arbeiten, um rauszufinden, welcher Socket was zu tun hat.
Aber damit kenne ich mich nicht genug aus, ich weiß nicht, ob select auch mit einem server socket funktioniert.
Vielleicht ist es für dich aber leichter, als sich in Threads einzulernen.
Ciao,
_
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.