Zu den Aufzeichnungen der tutorials.de-Live-Workshops
ERLEDIGT
NEIN
ANTWORTEN
6
ZUGRIFFE
1458
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    fettyteddy fettyteddy ist offline Mitglied
    Registriert seit
    Feb 2007
    Beiträge
    10
    Hey,

    ich habe unter Linux (C++) einen Client geschrieben. Dieser läuft mit zwei thread zum senden und empfangen von Daten.

    Soweit läuft der Client ohne Probleme, bis der Server meine Verbindung schließt, was immer mal vorkommen kann. Testweise habe ich einfach mal das Netzwerkkabel gezogen. Aber wie kann ich prüfen ob eine Verbindung noch besteht?

    Ich bin davon ausgegangen, wenn keine Verbindung besteht und ich send ausführe, das ich einen Fehler erhalten müsste.

    if (send(socketDescriptor, buf_out, strlen(buf_out) + 1, 0) < 0) {
    cerr << "cannot send data ";
    objWriteLogFile.writeline_log_file("cannot send data");
    close(socketDescriptor);
    exit(1);
    }

    doch es wird kein Fehler ausgeben. Alles ist, als würde die Verbindung noch bestehen. Nur irgendwie muss ich eine Verbindungsprüfung machen, um festzustellen wann ich neu Verbinden muss.

    auch

    if (socketDescriptor < 0) {
    objWriteLogFile.writeline_log_file("connection off");
    cout << "socketDescriptor connection off" << endl;
    } else {
    objWriteLogFile.writeline_log_file("connection on");
    cout << "socketDescriptor connection on" << endl;
    }

    zeigt eine bestehende Verbindung an (socketDescriptor connection on). Doch ohne Netzwerkkabel keine Verbindung!

    Wäre schön wenn mir bei dem Problem jemand helfen könnte!
    Danke
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    7.983
    Hi.

    Welche Art von Socket hast du denn kreiert?

    Hast du den Absatz in der Manpage schon gelesen:
    Zitat Zitat von man 2 socket
    The communications protocols used to implement a SOCK_STREAM insure that
    data is not lost or duplicated. If a piece of data for which the peer
    protocol has buffer space cannot be successfully transmitted within a
    reasonable length of time, then the connection is considered broken and
    calls will indicate an error with -1 returns and with ETIMEDOUT as the
    specific code in the global variable errno. The protocols optionally
    keep sockets ``warm'' by forcing transmissions roughly every minute in
    the absence of other activity. An error is then indicated if no response
    can be elicited on an otherwise idle connection for a extended period
    (e.g. 5 minutes). A SIGPIPE signal is raised if a process sends on a
    broken stream; this causes naive processes, which do not handle the sig-
    nal, to exit.
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    fettyteddy fettyteddy ist offline Mitglied
    Registriert seit
    Feb 2007
    Beiträge
    10
    ja habe ich gelesen. Bin auch davon ausgegangen nen -1 zu erhalten. Doch es kommt als Rückgabe keine -1.


    Habe einen SOCK_STREAM kreiert.


    ---------------------------------------------------------------------------------------------

    ...

    //SOCKET
    socketDescriptor = socket(AF_INET, SOCK_STREAM, 0);
    cerr << "cannot create socket\n";
    exit(1);
    }

    //IP
    serverAddress.sin_family = hostInfo->h_addrtype;
    memcpy((char *) &serverAddress.sin_addr.s_addr, hostInfo->h_addr_list[0], hostInfo->h_length);
    serverAddress.sin_port = htons(serverport);

    //CONNECT
    if (connect(socketDescriptor, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) < 0) {
    cerr << "cannot connect\n";
    exit(1);
    }

    ...

    //MULTI THREAD ERSTELLT

    //-SEND THREAD-
    while (true) {

    ...
    //keine Daten zum senden da

    sleep(20);
    ...

    //Daten zum senden vorhanden

    if (send(socketDescriptor, buf_out, strlen(buf_out) + 1, 0) < 0) {
    cerr << "cannot send data ";
    close(socketDescriptor);
    exit(1);
    }

    ...

    }

    ----------------------------------------------------------------------------------
    so läuft der SEND THREAD immer wieder durch. Irgendwann in dieser Schleife ziehe ich das Netzwerkkabel und normal müsste die Sendfunktion doch in "cannot send data " gehen oder
     

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    7.983
    Hi.

    Bitte mache dich mal mit dem Forum hier vertraut, editiere deinen Betrag und verwende die Code-Tags ([c]...[/c] für C bzw. [cpp]...[/cpp] für C++ Code) da dein Code so relativ unleserlich ist.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    fettyteddy fettyteddy ist offline Mitglied
    Registriert seit
    Feb 2007
    Beiträge
    10
    werde ich tun!
     

  6. #6
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.425
    Zitat Zitat von fettyteddy Beitrag anzeigen
    ja habe ich gelesen. Bin auch davon ausgegangen nen -1 zu erhalten. Doch es kommt als Rückgabe keine -1.
    Was bekommst du denn stattdessen?

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  7. #7
    fettyteddy fettyteddy ist offline Mitglied
    Registriert seit
    Feb 2007
    Beiträge
    10
    Stattdessen bekomme ich wie üblich bei der Send Funktion die Anzahl der versendeten Bytes zurück.

    Ich habe noch mal einige teste gemacht. Zwei Funktionen.

    Funktion1:
    Eine mit einer Schleife, die nach 20 Sekunden immer etwas sendet (send)

    Funktion2:
    Eine Schleife mit der recv-Funktion (im Wartezustand).

    Wenn ich das Netzwerkkabel abziehe:

    Funktion1: Send läuft fröhlich weiter, als wäre nichts gewesen. Gibt kein -1 zurück, sondern die Anzahl der Bytes, die ich auch übergebe.
    Funktion2: Bleibt die recv Funktion im Wartezustand! (Gibt auch kein -1 zurück).

    Stecke ich das Kabel wieder ein:

    Connectet der Client automatisch wieder. Die Senden Funktion läuft normal weiter und die Daten (Antworten auf die Anfrage) werden auch wieder empfangen.

    Aktuelle Lösung:
    -----------------------------
    Ich habe leider keine Möglichkeit gefunden um zu testen, dass die Verbindung auch wirklich besteht. Daher sende ich nun aller halbe Stunde in einer dritten Funktion einen Datensatz und prüfe, ob daraufhin eine Antwort eingetroffen ist. Wenn nicht, führe ich einen Reconnect durch.
    Nicht die Lösung, die ich mir vorgestellt habe, aber leider scheint das ganze nicht anders zu gehen.
    Geändert von fettyteddy (05.11.08 um 12:01 Uhr)
     

Ähnliche Themen

  1. Script zum Verbindungstest?
    Von Niklas1812 im Forum PHP
    Antworten: 3
    Letzter Beitrag: 06.02.10, 11:05
  2. Antworten: 3
    Letzter Beitrag: 23.05.09, 10:18
  3. Hibernate Verbindungstest
    Von RealHAZZARD im Forum Java
    Antworten: 4
    Letzter Beitrag: 27.02.09, 09:57
  4. Antworten: 2
    Letzter Beitrag: 30.01.08, 10:24
  5. Antworten: 2
    Letzter Beitrag: 29.01.08, 14:59

Stichworte