C/bksockets: Server soll mehrere Clients verwalten
-
Hallo,
ich bastele seit ein paar Tagen an Sockets herum (BKSockets, Linux, C).
Nun wollte ich ein einfaches Chatprogramm schreiben. Ich lege dazu einen Server mit TCP basierten Stream Socket (PF_INET und SOCK_STREAM) an.
Bei diesem sollen sich ein oder mehrere Clients verbinden koennen. Der Code der die Clients behandeln soll, soll ausge-fork-ed werden (ich will mir die pthreads fuer spaeter aufsparen). Schreibt nun ein Client etwas, wird es an alle anderen (Broadcastmaessig) gesendet, evtl auch an den eigenen, muss das noch sehn...
Ich habe mir gedacht ich lege in der Datei des Servers dazu ein globales int Array an: arrClients[NUM_OF_CLIENTS], in das ich die Sockethandles jedes angebundenen Clients eintrage (also den Return Code der funktion accept() beim Server) eintrage. Will ein ausgeforkter Prozess etwas senden, sendet er an die anderen Sockets die er in diesem arrClients findet.Ich habe etwas Kopfschmerzen wegen der Synchronisation von arrClients[].. ich benoetige die Operationen: "add, remove, get" - wie gesagt, ich will bei diesem Demo nicht auf Pthreads und Mutexes zurueckgreifen.
Fragen:
1. Kann das so ueberhaupt funktionieren, also ist eine globale Variable des Parent Prozesses den Kinderprozessen ueberhaupt zugaenglich oder handelt es sich bei den Kindprozessen schon um eine andere Instanz dieser Variablen? Falls nicht, wie implementiert man sowas/macht man ein array den Kindern zugaenglich?2. Erfolgt ein Zugriff der Kindprozesse auf die globale Variable des Elternprozesses hier in irgendeiner Form synchronisiert ab?
3. Gibt es Moeglichkeiten fuer ausgeforkte Prozesse diesen Zugriff zu synchronisieren ausser mit Mutexen, falls Zugriff moeglich ist aber nicht synchronisiert ablaeuft?
Danke im voraus
-
Fabeltier schrieb:
1. Kann das so ueberhaupt funktionieren, also ist eine globale Variable des Parent Prozesses den Kinderprozessen ueberhaupt zugaenglich oder handelt es sich bei den Kindprozessen schon um eine andere Instanz dieser Variablen?
Unterschiedliche Prozesse haben unterschiedliche virtuelle Speicher. Nur bei Threads (und beim Sonderfall Shared Memory) können mehrere Programmpfade auf denselben Speicher zugreifen.
Falls nicht, wie implementiert man sowas/macht man ein array den Kindern zugaenglich?
Threads
Shared Memory
oder andere IPC-Varianten (Signale, Message Queues, Pipes)Damit haben sich die anderen beiden Fragen erledigt.
-
Danke, werd mich mal einlesen