Deshalb muss ich wissen wie ich sowas erkennen kann. Hat niemand ne Idee?
Ganz einfach gesagt ( im worst case ) gar nicht !
Einfaches Beipiel :
Code:
send(socket,"String",strlen("String"),0);
while(true); // oder irgendwas anderes kompliziertes
int r = recv(socket,buffer,size_t,0);
Ein Prozess und ein Thread ! Woher willst du nun wissen, ob die Verbindung besteht ? Richtig, du weisst es gar nicht.
2. Beispiel
Code:
send(socket,"String",strlen("String"),0);
// Hier ist der Server offline
int r = recv(socket,buffer,size_t,0);
In diesem Fall bekommst du ein SIGPIPE und default mässig verabschiedet sich dein Programm ausser du machst ein
Die Frage ist ja, was du für deine Netzwerkprogrammierung verwendest, bei UPD weisst du ja nicht mal ob es ankommt, obwohl es meistens ja doch irgendwie ankommt.
Nun willst du eine Lösung haben nicht wahr ?
Meine Lösung wären Multicast Sockets ( sind etwas eleganter als ein Broadcast )
Du startest in deinem Prozess einen 2 Thread. Der Server macht z.B. jede Sekunde eine Meldung an seine Clients, z.b. "bin noch da". Diese Meldung musst du auswerten, kannst z.B. ein timeout für einen Socket setzen, wenn nach 2 Sekunden nichts ankam, läuft die Uhr ab. Versuche es nochmal und falls dann wieder nach 2 Sekunden nichts ankam, ist
- Server wohl weg
- Verbindung unterbrochen
- Netzwerk stark belastet
- Ein Fehler im Programm
- Server kam nicht dazu etwas zu schicken, falls viele Prozesse laufen
- usw. usw. usw.
Ist nicht sooo einfach die vernünftige Netzwerkprogrammierung. Empfängt dein Thread nun nichts vom Server kannst du den Prozess killen oder per Signal/Slot Verbindung bzw. Callback deinem Haupt Thread etwas signalisieren ( Boost.Signal Library ). Was ich aber überhaupt nicht empfehlen kann ist :
zb im nicht-blockierendem Modus
Sowas nennt sich Polling bzw. aktives warten und ist fast das schlimmste was man so machen kann, wenn man ständig einen Socket abfragt ohne das Daten ankommen.
je nachdem was du als Bibliothek verwendest
Für stupide Netzwerkprogrammierung benötigt man keine Bibliothek.
Die einfachste (aber nicht wirklich kluge) Möglichkeit, die mir einfällt, ist, dass du die Timeout-Zeit heruntersetzt.
Wirklich keine Kluge Idee :-D Ist im Netzwerk mal viel los, verabschieden sich dank des Timeout all deine Clients.
weil meinetwegen ich meinen netzwerkstecker gezogen habe oder mein router nen reconnect gemacht hat. wie kann ich sowas festellen?
Für sowas brauchst du keine Netzwerkprogrammierung, du musst nur schon ob dein eth* noch aktiv ist.