Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
JW1 registrierter User
Anmeldungsdatum: 13.01.2010 Beiträge: 11
|
(#1662019) Verfasst am: 14.07.2011, 14:24 Titel: C, Linux, Socket, Fork |
|
|
Schönen guten Tag,
ich möchte eine Chatsoftware schreiben (bzgl ist es kein Problem). Was mich jetzt interessiert ist eher die Tatsache, wie ich das Problem mit dem HTTP-Stream löse. HTTP ist ja bekanntlich dafür gemacht, dass es irgendwann mal aufhört zu laden.
Wie machen es andere Chat-Anbieter, dass die Seite mit den Nachrichten nicht aufhört zum Laden? (PS.: ICH WEIGER MICH IRGENDWAS MIT \*JAVA[SCRIPT]*\ ZU BENUTZEN)
mein Ansatz: C Programm mit folgenden Aufbau
Code: |
* Headerzeug
* int clients[MAX_CONNECTIONS] = -1
* int n = 0;
* main
* /socket, bind, listen ... /
/Beginn: Dauerschleife
clients[n] = accept....
if (fork() == 0)
{
//HIER WIRD JEDER EINZELNE CLIENT BEHANDELT
}
if (n != -1)
{
n++ % MAX_CONNECTIONS; // Index des Socket Arrays erhöhen (aber nicht höher als MAX_CONNECTIONS)
}
/"Ende" der Dauerschleife
return 0; |
Folgendes Problem gibt es: An welcher Stelle hole ich die Daten aus der Datenbank? es wäre uneffizient, wenn man die daten für jeden client extra per query aus der datenbank holt. ich brauche die Daten an der Stelle wo "//HIER WIRD JEDER EINZELNE CLIENT BEHANDELT" steht.
Meine Frage nun: Wie bekomme ich Daten vom Hauptprogramm zu den einzelnen durch Fork() erstellten Prozessen?
PS.: meine Lösung basiert auf Forks. Ich hätte auch nichts gegen eine Thread-Lösung, falls jemand so etwas besitzt
PPS.: sollte es mir gelingen, dann stell ich den quellcode online.
LG
|
|
Nach oben |
|
 |
Lukianos Oberzyniker
Anmeldungsdatum: 28.12.2008 Beiträge: 63
Wohnort: Dresden
|
(#1662115) Verfasst am: 14.07.2011, 17:44 Titel: |
|
|
Mit Javascript könntest du dir dann mal Websocket anschauen.
Das ist erst im kommen und genau richtig dafür.
Was du suchst ist ein Mechanismus mit Listener und Observer
und so Pipapoo.
Unter POSIX gibt es die Funktion select. Ist aber nichts schwache Nerven.
Ansonsten empfehle ich immer ein gutes Buch über UNIX Systemprogrammierung.
Für einsame kalte Winternächte ideal.
|
|
Nach oben |
|
 |
Assarbad Computerversteher
Anmeldungsdatum: 29.07.2011 Beiträge: 105
Wohnort: Reykjavík
|
(#1668930) Verfasst am: 29.07.2011, 19:32 Titel: Re: C, Linux, Socket, Fork |
|
|
JW1 hat folgendes geschrieben: | ich möchte eine Chatsoftware schreiben (bzgl ist es kein Problem). Was mich jetzt interessiert ist eher die Tatsache, wie ich das Problem mit dem HTTP-Stream löse. HTTP ist ja bekanntlich dafür gemacht, dass es irgendwann mal aufhört zu laden.
Wie machen es andere Chat-Anbieter, dass die Seite mit den Nachrichten nicht aufhört zum Laden? | Da gibt es Varianten wo der Client sozusagen gleich als Hausaufgaben mit auf den Weg bekommt, daß er sich alle paar Zeitintervalle neue Daten abholen soll. Ansonsten Stichwort: Chunked Encoding.
JW1 hat folgendes geschrieben: | mein Ansatz: C Programm mit folgenden Aufbau | Wir leben in den 201xern, C? Ich muß beruflich jede Menge C-Code pflegen und bin jedesmal froh wenn ich mal mit anderen Sprachen rummachen darf nachdem ich mit dem C rumwursteln mußte. Natürlich ist da auch ein (nicht so kleines) Problem, daß mein Chef stolz darauf ist über 20 Jahre alte Paradigmen anzuwenden und ansonsten auch sehr seltsame und überholte Ansichten bzgl. C pflegt (keine Header-Guards, keine Initialisierung bei Deklaration von Stackvariablen) ...
(er kennt meine Meinung dazu, weshalb ich keine Problem habe das hier zu schreiben )
JW1 hat folgendes geschrieben: | Folgendes Problem gibt es: An welcher Stelle hole ich die Daten aus der Datenbank? es wäre uneffizient, wenn man die daten für jeden client extra per query aus der datenbank holt. ich brauche die Daten an der Stelle wo "//HIER WIRD JEDER EINZELNE CLIENT BEHANDELT" steht. | Du irrst, genaugenommen brauchste die Daten vor dem fork(). Warum? Weil ansonsten dein Child nicht die Daten bekommt. Sinnvolle Alternative: memory mapped files (mmap() und Freunde).
JW1 hat folgendes geschrieben: | Meine Frage nun: Wie bekomme ich Daten vom Hauptprogramm zu den einzelnen durch Fork() erstellten Prozessen? | Passiert "automagisch" bei einem kompletten Fork.
JW1 hat folgendes geschrieben: | PS.: meine Lösung basiert auf Forks. Ich hätte auch nichts gegen eine Thread-Lösung, falls jemand so etwas besitzt | Wozu? Wenn du ein "fork() light" willst, nimm halt vfork(). Schonmal mit einer der Thread-Bibliotheken gearbeitet? Zuerst die Qual der Wahl: welche genau nehmen? Und dann haben die alle kleine und feine Unterschiede. Da verlasse ich mich lieber auf fork(), auch wenn es sich dabei um eine Haßliebe handelt
|
|
Nach oben |
|
 |
nocquae diskriminiert nazis
Anmeldungsdatum: 16.07.2003 Beiträge: 18183
|
(#1668932) Verfasst am: 29.07.2011, 19:40 Titel: |
|
|
AEW’ler … Reykjavik … du arbeitest aber nicht rein zufällig bei CCP, oder?
_________________ In Deutschland gilt derjenige, der auf den Schmutz hinweist, als viel gefährlicher, als derjenige, der den Schmutz macht.
-- Kurt Tucholsky
|
|
Nach oben |
|
 |
Assarbad Computerversteher
Anmeldungsdatum: 29.07.2011 Beiträge: 105
Wohnort: Reykjavík
|
(#1668939) Verfasst am: 29.07.2011, 19:53 Titel: |
|
|
nocquae hat folgendes geschrieben: | AEW’ler … Reykjavik … du arbeitest aber nicht rein zufällig bei CCP, oder? | Nope
... auch wenn einige von uns dorthin gewechselt sind. Die sollen zumindest ne bessere Kantine als wir haben (mit Sternekoch, sagt man).
|
|
Nach oben |
|
 |
|