mikrocontroller.net

Forum: PC-Programmierung Client/Server verbindung überprüfen


Autor: Carolin Zapa (seobalis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

wie kann ich festlegen, ob die Verbindung zwischen Client und Server 
noch existiert, wenn ich gerade in einem Schleifer bin
wie z.B:
server_sock = socket(AF_INET, SOCK_STREAM, 0);
    
opt = 1;
setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));


server.sin_family = AF_INET;
server.sin_port = htons(src_port);
server.sin_addr.s_addr = inet_addr(src_addr);

bind(server_sock, (struct sockaddr*) &server, sizeof(server));

listen(server_sock, 5);

len = (int) sizeof(client);
accept_sock = accept(server_sock, (struct sockaddr*) &client, &len);

recv_len = recv(accept_sock, buf, 1024, 0); 

for(;;) {
// do something
// wie kann ich die Verbindung überprüfen ohne recv funktion zu rufen
// hier soll der Schleifer abgebrochen werden, wenn die Verbindung nicht mehr existiert

}


Es wäre sehr nett wenn ihr mir weiter helfen könntet.

Grüße,

Carolin

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Carolin Zapa schrieb:

> Es wäre sehr nett wenn ihr mir weiter helfen könntet.

Üblicherweise definiert man einen 'Is Alive' bzw 'Keep Alive' 
Mechanismus. Der könnte zb so aussehen.
Jeder Kommunikationspartner hat einen Timer mitlaufen. Jedesmal, wenn 
der Empfänger (egal ob Client oder Server) etwas empfängt, setzt er den 
Timer zurück. Läuft der Timer ab, dann wird die Verbindung per 
Definition als unterbrochen definiert.
Damit jetzt aber die Verbindung nicht als unterbrochen gilt, nur weil 
keiner etwas zu sagen hat, gibt es eine 'Keep Alive' Nachricht. Ihre 
einzige Aufgabe ist es, der Gegenstelle mitzuteilen "Juhu, ich bin noch 
da". Bleibt also die Keep Alive Meldung eine bestimmte Zeitspanne aus 
und gibt es auch sonst nicht zu übertragen was den Timer zurücksetzen 
würde, dann geht die Gegenstelle davon aus, dass die Verbindung 
abgebrochen ist.

Autor: Carolin Zapa (seobalis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke schon mal für deine Antwort. Mit setsockopt(SO_KEEPALIVE) kann man 
"keep alive" für socket einstellen, aber ich weiß immer noch nicht wie 
ich in meinem Fall anwenden soll, damit ich weiß dass mein Partner nicht 
mehr da ist ohne recv funktion zu benutzen. Mit getsockopt() kann ich 
nur wissen ob Keep alive eingeschaltet wird. Mit welcher Funktion oder 
Anwendung soll ich im for(;;) Schleifer rufen

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Carolin Zapa schrieb:
> danke schon mal für deine Antwort. Mit setsockopt(SO_KEEPALIVE) kann man
> "keep alive" für socket einstellen,

Das kann die Lösung sein, kann es aber auch nicht sein.

Hast du danach schon einmal gegoogelt?
Von "Der Keep Alive wird alle 2 Stunden ausgelöst und kann nur sehr 
umständlich konfiguriert werden" bis hin zu "Nicht alle Netzwerk Typen 
unterstützen von sich aus ein Keep Alive" findet sich da alles mögliche.

> ich in meinem Fall anwenden soll,

implementiere es dir selber!

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 recv_len = recv(accept_sock, buf, 1024, 0);

 if(recv_len == SOCKET_ERROR)
 {
    err = WSAGetLastError();
    switch(err)
    {
    case WSAECONNRESET :
      printf("socket  reset.\n");
      break;
    default :
      serror("recv",err);
    }
 }
 else
 {
    if(0 == recv_len)
    {
       printf("socket closed from remote.\n");
    }
    else
    {
       // Hier empfang auswerten
    }
 } 

Bis Conection_Reset kommt kann es typ. 2min dauern.

Autor: Carolin Zapa (seobalis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>     if(0 == recv_len)
>     {
>        printf("socket closed from remote.\n");
>     }
>     else
>     {
>        // Hier empfang auswerten
>     }

Wenn ich auf Recv funk zugreifen kann, dann weiß ich ob mein Partner 
noch da ist, aber ich bin gerade in For(;;) schleife, und kann oder darf 
die recv funktion nicht rufen. Von daher suche ich eine andere 
Möglichkeit zu wissen ob die Verbindung noch lebt ohne recv zu rufen

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Problem ist äquivlant zu:

Dein Kumpel fährt in den Amazonas auf Expedition.
Wenn er sich nicht regelmässig bei dir meldet und du ihn nicht anrufen 
darfst, hast du keine Möglichkeit zu wissen, ob er noch am Leben ist 
oder ob es besser wäre, eine Rettungsexpedition loszuschicken.

Was ist daran so schwer zu verstehen?

Genau das musst du implementieren: Die Gegenstelle meldet sich in 
regelmässigen Abständen um mitzuteilen: Es geht mir gut.

Zwischen diesen zeitlichen "Checkpoints" hängt der Status in der Luft, 
erst wenn die Meldung zum verabredeten Zeitpunkt nicht eintrifft, weißt 
du das etwas passiert sein muss.

Und nein. Ohne einen recv oder einen select ist das nicht zu machen.
Du darfst den Socket nicht im 'Blocking Mode betreiben', so dass recv 
nicht aktiv auf Daten wartet, sondern auch dann zurückkommt, wenn keine 
Daten vorhanden sind.

http://www.scottklement.com/rpg/socktut/nonblocking.html

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, entweder non blocking (meist ungeschickt) oder select() (meist
geschickter, aber komischerweise drücken sich die Leute davor).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.