Anzeige:
Ergebnis 1 bis 8 von 8

Thema: Prüfen ob socket noch verbunden ist

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Registrierter Benutzer
    Registriert seit
    14.09.2003
    Ort
    Schifferstadt
    Beiträge
    24

    Prüfen ob socket noch verbunden ist

    Hallo!

    Wie kann man in C/C++ prüfen, ob ein Socket noch verbunden ist.
    Ich will praktisch bei einem Server eine while Schleife solange durchlaufen lassen,
    wie der Client auch verbunden ist.
    Erst wenn der Client die Verbindung abbaut soll der Server wieder neue Verbindungen annehmen.

    MfG
    deki

    Edit: Das ganze natürlich unter Linux mit den normalen Linuxsockets.
    Geändert von deki (16-11-2003 um 15:18 Uhr)

  2. #2
    Registrierter Benutzer
    Registriert seit
    10.03.2001
    Ort
    Delmenhorst
    Beiträge
    118
    hi


    probier einfach mal:

    if (socket)
    {
    printf ("verbindung besteht\n");
    }
    else
    {
    printf ("keine verbindung\n");
    }
    Holarse.de - Spielen unter Linux

  3. #3
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Das geht nicht, der Socket ist ein Filedescriptor und damit ein int.
    Das wäre praktisch immer wahr.

    Man könnte es mit einem poll oder select versuchen.

    Ein verbundener Socket müsste im Normalfall zum Schreiben bereit sein, wenn nicht gerade reingeschrieben wurde.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  4. #4
    Registrierter Benutzer
    Registriert seit
    26.12.2001
    Beiträge
    228
    hi,

    solange ein Socket verbunden ist gibt er doch bei einem recv etc. immer Zahlen größer als 0 zurück, wenn er dann nicht mehr verbunden ist, dann gibt er -1 zurück. Zumindest habe ich das so in Erinnerung.

    Steve
    pornstars-online.de

  5. #5
    Registrierter Benutzer
    Registriert seit
    19.04.2003
    Beiträge
    194
    Original geschrieben von Badsteve
    hi,

    solange ein Socket verbunden ist gibt er doch bei einem recv etc. immer Zahlen größer als 0 zurück, wenn er dann nicht mehr verbunden ist, dann gibt er -1 zurück. Zumindest habe ich das so in Erinnerung.

    Steve
    jep, so hab ich das auch immer gemacht!

    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.

  6. #6
    Registrierter Benutzer
    Registriert seit
    14.09.2003
    Ort
    Schifferstadt
    Beiträge
    24
    Hallo!

    Vielen Dank für die Antworten.
    Ich habe gerade den Vorschlag mit recv und -1 ausprobiert.

    Mein Code sieht gerade ungefähr so aus:
    Code:
    while (true)
    {
            bool connected;                            // Hier wird der Connect Status gespeichert
            if ( (client_socket = accept (server_socket, NULL, 0) ) == -1)        // Server akzeptiert Verbindungen
                    return -1;
    
            connected = true;
    
            char recv_buffer[1024];                    // Buffer für empfangene Daten
            int received;                              // Länge der empfangenen Daten
    
            while (connected)
            {
                     if ( (received = recv (client_socket, recv_buffer, sizeof(recv_buffer)-1, 0) ) == -1)     // Hier werden die daten empfangen
                     {
                             connected = false;        // Falls -1 zurückgeliefert wird, wird Status auf Disconnected 
                             break;                    // gesetzt und while Schleife durch break; unterbrochen
                     }
                     recv_buffer[received] = '\0';
    
                    handle_buffer (recv_buffer);        // Funktion, die die empfangenen Daten auswertet
             }
    }
    Allerdings funktioniert das auch nicht.
    Wenn ich mit NetCat connecte und durch STRG-C wieder die Verbindung beende, geht er aus der "while (connected)" Schleife nicht raus, sondern
    bleibt in der Schleife drin.
    Da er aber nix mehr empfangen kann, steigt die CPU Auslastung auf 100% an

  7. #7
    Registrierter Benutzer
    Registriert seit
    07.08.2002
    Ort
    Berlin
    Beiträge
    55
    welchen Wert hat den 'received' nachdem der Client sich getrennt hat.

    Im übrigen kann read() & recv() nur im Zusammenhang mit einem verbundenen Sockets aufgerufen werden. Vieleicht hilft Dir das weiter in Bezug auf 'received'

    recvfrom() kann dagegen jederzeit aufgerufen werden.

    cu Shack

  8. #8
    Registrierter Benutzer
    Registriert seit
    14.09.2003
    Ort
    Schifferstadt
    Beiträge
    24
    Vielen Dank für die Antwort.
    Ich hab jetzt nach der if Abfrage einfach mal den wert von received ausgeben lassen.
    Wenn ich mit dem Client die Verbindung trenne, hat received den Wert 0.
    Und das wird dann unendlich oft ausgegeben, bis ich den Server kille *gg*
    Anscheinend liefert recv 0 zurück, wenn keine Verbindung mehr besteht.
    Wenn ich jetzt teste, ob received den Wert 0 hat, und dann die Schleife verlasse, nimmt der Server wieder neue Verbindungen an.

    Mein Problem ist admit also gelöst!
    Vielen Dank an alle die geantwortet haben!


    PS:
    Ich habe gerade in der man-Page von recv entdeckt, dass tatsächlich 0 zurückgegeben wird, wenn die verbindung abgebaut wird.
    RETURN VALUE
    These calls return the number of bytes received, or -1 if an error occurred. The return value will be 0 when the peer has performed an orderly shutdown.
    Geändert von deki (19-11-2003 um 16:04 Uhr)

Lesezeichen

Berechtigungen

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