Chat mit TServerSocket
-
Hallo,
ich bau mir gerade ein kleinen Chat und benutze die TServerSocket und TClientSocket komponenten dafür, das funktioniert auch so einigermaßen.
Meine Frage wäre wenn der Client an den Server etwas verschickt (Text) woher weiss denn der Client ob die Nachricht wirklich auch beim Server angekommen ist ?
Wie kann man das überprüfen ?
-
verwende TCP, dann kannst du dir 100% sicher sein.
EDIT: falls nicht erhältst du beim client einen Fehler.
EDIT 2: Ich kenne die Implementierung des TServerSockets und TClientSockets nicht / was dahinter steckt. Ist vielleicht vermutlich sogar TCP (?). Oder kann der alles / je nach optionen?
-
Hallo,
habe jetzt die Sache längerfristig testen können, hat die Verbindung eine Macke dann bemerkt der Client es erst dann wenn er wieder senden will.
Ja TServerSocket/TServerClient ist TCP, das Protokoll wird auch so in der Firewall angezeigt.
Dort wo der TServerSocket läuft muss auch Portforwarding aktiv sein und der jeweilieg Port geöfnet sein,
das gilt aber nur dann sobald man übers Internet kommunizeren möchte, also Beispielweise muss im Router dieser Port geöffnet sein.Probleme bereitete uns immer wieder ein Asynchroner Socket-Fehler 10053, sobald 15minuten nix gesendet wurde tauchte er auf.
Im LAN konnte ich den Fehler mit der setsockopt beheben aber nicht übers Internet.
(TClientSocket/LAN/Windows OS)int so_optval=1; setsockopt(Socket->SocketHandle, SOL_SOCKET, SO_KEEPALIVE, (const char*)&so_optval, sizeof(so_optval));
(TClientSocket/Internet)
Um den TimeOut auch übers Internet zu umgehen sende ich halt im Hintergrund alle 15 minuten vom Clienten
aus minimale Daten zum Server, bis jetzt funktioniert das einwandfrei, Socket Fehler behoben.Es gibt sicherlich viele Ursachen (OS, Firewall, Router) für den TimeOut, kann leider nicht jeden futz auf den Grund gehen,
und habe mich somit für die Sache so entschieden.
-
TCP-Verbindungen neigen schnell dazu unbemerkt zu sterben, wenn nichts gesendet wird. Man muss auf Anwendungsebene regelmäßig Nachrichten austauschen, um den Verbindungsverlust zu verhindern oder zu bemerken. Das ist absichtlich so, weil die Anwendung am besten feststellen kann, ob und wann eine Verbindung als verloren gilt. Keep-Alive funktioniert nicht gut, wie du bereits bemerkt hast.