Anzeige:
Ergebnis 1 bis 7 von 7

Thema: Socket Problem

  1. #1
    Registrierter Benutzer
    Registriert seit
    15.04.2003
    Beiträge
    43

    Socket Problem

    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:

    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

  2. #2
    Registrierter Benutzer Avatar von phate
    Registriert seit
    14.02.2003
    Beiträge
    149
    Hi suse,

    die Lösung Deines Problems liegt im fork()-en des Server-Prozesses bei jeder angenommenen Verbindung.
    Code:
    man fork
    Dabei 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.

  3. #3
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    bind() und listen() kommen außerhalb der Schleife, weil die nur einmal gebraucht werden.
    Nur accept() muss in der Schleife bleiben.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  4. #4
    Registrierter Benutzer
    Registriert seit
    19.04.2003
    Beiträge
    194
    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
    Going to church does not make a person religious, nor does going to school make a person educated, any more than going to a garage makes a person a car.

  5. #5
    Registrierter Benutzer
    Registriert seit
    15.04.2003
    Beiträge
    43
    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

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  7. #7
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •