PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Socket Problem



suse
22-09-2003, 22:25
Hallo,

komme am besten sofort zu Sache:

Habe mir einen kleinen Server Socket Programmiert. Er läuft auch wunderbar jedoch würde ich gerne folgende Funktion einbauen:

- bei jeder neuen Verbindung sollte sich ein neuer Prozess öffnen
- dieser Prozess sollte dann die Anfrage des Clients bearbeiten und der eigentliche Server sollte also immer noch laufen
- also jede neue Anfrage sollte einen neuen Prozess öffnen
- dies Verbindung sollte offen beleiben

Weiss einer vielleicht von euchen wie ich es am besten hinbekommen könnte!
Hier mein Server Code:



#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main()
{
int server_socket, client_socket;
int laenge, ende, zahl =0;
struct sockaddr_in serverinfo, clientinfo;
char empfangene_zeichen[1000];
char puffer[100]; // Puffer fuer die sprintf() Funktion
char web_seite[] ="HTTP/1.1 200 OK\r\n\r\n\
<html><body><h1><center>Hallo Web-World</center></h1></body></html>";

server_socket = socket(AF_INET, SOCK_STREAM, 0);

serverinfo.sin_family = AF_INET;
serverinfo.sin_addr.s_addr = inet_addr("192.168.123.13");
serverinfo.sin_port = htons(5000);
laenge = sizeof(serverinfo);


while(1) //Start der Endlosschleife
{
zahl++; //Zaehler
bind(server_socket,(struct sockaddr*)&serverinfo, laenge);

listen(server_socket, 3);

//printf("\n Der Server wartet.....\n");

client_socket = accept(server_socket, (struct sockaddr*)&clientinfo, &laenge);
//printf("\nVerbindung mit %s war erfolgreich!\n", inet_ntoa(clientinfo.sin_addr));

sprintf(puffer,"<html><body><center>Du bist mein %d Besucher</center></body></html>",zahl);
//Mit der dieser Funktion gebe ich eine Funktion im Browser aus
read(client_socket, empfangene_zeichen, sizeof(empfangene_zeichen));
write(client_socket, web_seite,sizeof(web_seite));
write(client_socket, puffer,strlen(puffer));
// Der Puffer gibt nur das wieder was drin steht nicht so wie in der sizeof()
// Funktion
close(client_socket);

} // ende der Endlossschleife

close(server_socket);

printf("\nServer beendet");
}


Ich danke schonmal im vorraus!

gruss
suse

phate
23-09-2003, 08:59
Hi suse,

die Lösung Deines Problems liegt im fork()-en des Server-Prozesses bei jeder angenommenen Verbindung.
man forkDabei wird der Prozess in zwei Prozesse "gesplittet" (Es wird ein identischer Kindsprozess Deines Serverprozesses erstellt).

Über den Rückgabewert von fork kannst Du bestimmen, in welchem Prozess Du Dich dann befindest und entsprechend weiterverfahren.

anda_skoa
23-09-2003, 09:46
bind() und listen() kommen außerhalb der Schleife, weil die nur einmal gebraucht werden.
Nur accept() muss in der Schleife bleiben.

Ciao,
_

Silver
23-09-2003, 16:28
wann sollte man eigentlich threads und wann kindprozesse einsetzen?
gibts da bestimmte "regeln", oder hängt das nur von der logik das programm ab?

mfG

suse
23-09-2003, 22:25
Danke für die schnellen Antworten!

Hätte vielleicht einer von euch ein Beispiel ... oder einen Vorschalg wie ich es in mein Programm einbauen sollte?

gruss
suse

anda_skoa
23-09-2003, 23:14
Original geschrieben von Silver
wann sollte man eigentlich threads und wann kindprozesse einsetzen?
gibts da bestimmte "regeln", oder hängt das nur von der logik das programm ab?


Da gibts keine Regeln, das ist eine Designentscheidung.

Ein Kindprozess braucht mehr Startzeit und hat extra Speicherbedarf.
Dafür kann ein Absturz des Kindprozesses vom Elternprozess und den anderen Kindern verkraftet werden (laufen weiter).

Apache2 hat aus diesem Grund mehrere Modelle in Modulen ausgelagert, so dass der Admin aus seinen Bedürfnissen das geeignetste wählen kann.

Ciao,
_

anda_skoa
23-09-2003, 23:15
Original geschrieben von suse
Danke für die schnellen Antworten!

Hätte vielleicht einer von euch ein Beispiel ... oder einen Vorschalg wie ich es in mein Programm einbauen sollte?


Ich glaube hier im Forum oder zumindest hier am Board gibts schon Beispiele dazu.
Such mal nach fork und socket.

Ciao,
_