Socket Verbindung aufrecht halten

Maggio

Grünschnabel
Ich bin gerade bei den ersten Schritten eine Socket Verbindung zu bauen.
Verbindung und Datentransfer habe ich geschafft, inkl. einer Ping-Funktion, die alle 30 Sek. 1 Byte sendet, um die Verbindung aufrecht zu halten.
Jetzt bin ich bei einer Frage, wo ich vor irgendwelchem Code erstmal eine Idee brauche, wie ich das grundsätzlich mache.

Mal angenommen eine Verbindung steht, hat aber durch irgendwelche Umstände einen kleinen Aussetzer.
Wenn also die Verbindung abbricht, aber sofort wieder aufgebaut werden kann, weil das Programm an beide Enden noch läuft, was tun?
Dem Client eine Fehlermeldung ausgeben, oder im Hintergrund die Verbindung wieder aufbauen ohne dass der User den Abbruch bemerkt?
Wie oft passiert sowas überhaupt? Ist es den Aufwand überhaupt wert dafür eine Wiederaufbau-Funktion zu schreiben, oder passiert das so selten, dass eine Fehlermeldung reicht?
 
Hi

inkl. einer Ping-Funktion, die alle 30 Sek. 1 Byte sendet, um die Verbindung aufrecht zu halten.
Das geht auch ohne.
Mal angenommen eine Verbindung steht, hat aber durch irgendwelche Umstände einen kleinen Aussetzer.
Wenn also die Verbindung abbricht, aber sofort wieder aufgebaut werden kann, weil das Programm an beide Enden noch läuft, was tun?
Dem Client eine Fehlermeldung ausgeben, oder im Hintergrund die Verbindung wieder aufbauen ohne dass der User den Abbruch bemerkt?
Wie oft passiert sowas überhaupt? Ist es den Aufwand überhaupt wert dafür eine Wiederaufbau-Funktion zu schreiben, oder passiert das so selten, dass eine Fehlermeldung reicht?
Ein Abbruch, bei dem sofort wieder ein fehlerfreier Aufbau möglich ist...
keine (sinnvolle) Idee, warum das passieren könnte.

Natürlich geht "unterwegs" nicht immer alles 100% wie gewünscht,
aber um sowas muss man sich als reiner Verwender von Sockets nicht kümmern.
Was da außer deinen Daten noch über die Leitung geht,
um sicherzustellen, dass deine Daten auch wirklich problemlos zugestellt werden...
um das haben sich schon andere Programmierer irgendwann mal gekümmert.
 
Danke für die Antwort.

Ich weiss auch nicht warum, aber es kommt halt vor.
Ich wüsste zu gerne was da schief geht, aber ich kann es nicht eingrenzen, weil es bei mir zu selten auftritt (vielleicht einmal pro Woche).
Ich kann nicht mal sagen, wie oft es bei anderen Usern auftritt, denn die übertreiben gerne, wenn Rückmeldungen kommen ala "andauernd Disconnect".
Ich habe mir 10 identische VM´s installiert, die alle nichts weiter tun als die Verbindung aufbauen und alle 30 Sekunden 1 Byte mit dem Server austauschen.
Dabei tritt im Schnitt vielleicht alle paar Stunden ein Disconnect auf, nach Zufallsprinzip, immer nur eine der Verbindungen, nie mehrere, immer am Client, nie am Server.
Darum vermute ich, dass es an irgendwas in Windows liegt, Netzwerk überlastet oder was.

Vielleicht hat ja jemand einen Tipp, wie ich dem auf die Spur kommen, oder besser wie ich es vermeiden kann?
 
Mal eine bescheide Frage: Warum musst die Verbindung überhaupt aufrecht erhalten bleiben? Warum baust du nicht so was auf wie:

- Client verbindet sich zum Server
- Client sendet Daten an Server und wartet auf Antwort
- Client baut Verbindung ab
- usw....

Wenn eine Verbindung initiativ vom Server ausgehen soll, brauchst du ein Peer-to-Peer-Konzept, bei dem jeder Host sowohl Client als auch Server ist.

In den meisten Fällen dürfte eine permanente Verbindung nicht nutzbringend sein.
 
Das soll ein Chatserver werden, sprich die Clients müssen die Verbindung aufbauen aber danach müssen bidirektional Daten gesendet und empfangen werden.
 
Nun, dann schau dir doch mal an, ob das mit P2P nicht besser zu lösen ist. Vor allem stressfreier ;-)

Du kannst ja eine Library bauen, die die Funktionen für Client und Server bereitstellt und dann ist jeder Client gleichzeitig auch Server.
 
Wieso nicht einfach eine List mit den verfügbaren Clienten? Sollte es möglich sein mindestens einen Clienten/Server (Jeder sollte wie beides in diesem Falle funktionieren) zu haben, der dauerhaft online ist, könntest Du einfach durchs Anmelden und Abmelden (Mit Verbindungsabbruch zwischendurch) eine Liste erstellen mit den momentan verfügbaren Clienten, welche diese Liste ebenfalls abrufen können. So wäre eine dauerhafte Verbindung nicht nötig. Sollte es eine neue Nachricht geben, so wird diese an alle Clienten versand, die sich als verfügbar gemeldet haben. Sollte eine Übertragung nicht klappen, da sich ein Client kurzzeitig vom Netz getrennt hat, kann, mit einer Verzögerung, erneut versucht werden, die Nachricht zu versenden.
 
Wenn du mit Sockets testest, und etwas realistischere Bedingungen haben willst, darfst du nicht Server und Client auf dem selben Rechner haben. localhost wird völlig anders behandelt. Viele mögliche Probleme treten da gar nicht erst auf.

Lieblingsproblem ist dann, daß man die Nachricht nicht am Stück absetzen kann, bzw. die nicht am Stück am Gegenpart ankommt. Mit sowas muß man auf jeden Fall rechnen.
 
Lieblingsproblem ist dann, daß man die Nachricht nicht am Stück absetzen kann, bzw. die nicht am Stück am Gegenpart ankommt. Mit sowas muß man auf jeden Fall rechnen.

Und wieso dann nicht einfach die Länge der zu erwartenden Nachricht vorschicken, bzw. mit einem eindeutigem Delimiter zw. alter und neuer Nachricht, um anzugeben, wann eine Nachricht anfängt/aufhört? Sehe da kein Problem.
 
Nachrichtenlänge und Datenübertragung ist überhaupt kein Problem, das habe ich gelöst, dabei treten nie Probleme auf.
Ich habe auch nicht Client und Server auf demselben Rechner, sondern ich habe einen (gemieteten) Rootserver.
Clients zu Servern machen ist nicht drin, weil (allen voran ich selber) viele Clients hinter ganz schizophrenen NAT´s sitzen, die selbst mit NAT-Traversal nicht erreichbar sind.

Es geht auch nicht darum, ob ein Client erreichbar ist, es geht darum dass ein untätiger Client der im (blocking) recv() hängt, ohne ersichtlichen Grund aus dem recv() ausbricht und SOCKET_ERROR meldet.
 
Zurück