Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Router geht Offline, wie bekommt das ein ClientSocket mit ? (https://www.delphipraxis.net/35769-router-geht-offline-wie-bekommt-das-ein-clientsocket-mit.html)

PeterP. 11. Dez 2004 15:31


Router geht Offline, wie bekommt das ein ClientSocket mit ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

ich habe folgendes Problem:
Ich habe einen ClientSocket, der eine Verbindung zu einem Server ins Internet herstellt und Packete empfängt und sendet. (Ein simpler Chat)
Es klappt auch alles wunderbar, nur wenn man hinter einem Router ist und der die Verbindung nach einer bestimmten Zeit trennt, dann merkt der Client nichts davon. Und wenn man dann ein Packet mit dem Client sendet, dann baut der Router eine neue Verbindung auf und hat somit meist ja auch eine neue IP.
Hab schon versucht nach dem "send()" WSAGetLastError abzufangen, aber der bleibt auch bei 0.

Kann man das denn irgendwie prüfen, ohne daß der Router eine Verbindung aufbaut ?
Die Internet IP kann man ja auch schlecht hinter einem Router abfragen ohne eine Verbindung ins Internet zu erzwingen.

Bin für jede hilfreiche Idee dankbar.

Und nochwas:
Ich benutze nicht die Scktcmp Unit und auch keine Fenster nur eine Konsole.
Warum ?
Weil ein Freund von mir (C++ Programmierer) meinte, daß es mit Delphi nicht möglich sei einen Internet Chat Clienten kleiner als 200kb zu programmieren. Und sowas kann man ja nicht auf sich sitzen lassen. :mrgreen:
Also versuch ich den so klein wie nur möglich zu bekommen und benutze die angehängte Socket Unit, in der ja nur ein Client sein muss.

Schöne Grüsse
PeterP.

thomasdrewermann 11. Dez 2004 15:57

Re: Router geht Offline, wie bekommt das ein ClientSocket mi
 
Sollte man vielleicht die aktuelle WAN-IP abfragen?

Damit würde man es merken.

MFG
THomas

Duffy 11. Dez 2004 16:03

Re: Router geht Offline, wie bekommt das ein ClientSocket mi
 
Hallo Zusammen,
und da gab es noch das Ereignis "OnDisconnect" ...

Das schreibt die Delphi Hilfe dazu:
Das Ereignis OnDisconnect tritt auf Client-Sockets unmittelbar nach dem Schließen der Verbindung zum Server auf.

Delphi-Syntax:

property OnDisconnect: TSocketNotifyEvent;

C++ Syntax:

__property TSocketNotifyEvent OnDisconnect = {read=FOnDisconnect, write=FOnDisconnect};

Beschreibung

Schreiben Sie eine Ereignisbehandlungsroutine für OnDisconnect für den Client-Socket, damit nach dem Schließen der Verbindung zu einem Server-Socket spezielle Operationen ausgeführt werden.

bye
Claus

PeterP. 11. Dez 2004 16:19

Re: Router geht Offline, wie bekommt das ein ClientSocket mi
 
@thomasdrewermann
"Die Internet IP kann man ja auch schlecht hinter einem Router abfragen ohne eine Verbindung ins Internet zu erzwingen."


@Duffy
Also ungefähr so ? (Hab das mal getestet und funktioniert nicht)

Code:
type
 TSocketNotifyEvent = procedure (sender: TObject) of object;  // eingefügt

type
  TClientSocket = class(TObject)
  private
    FAddress: pchar;
    FConnected: boolean;
    FOnDisconnect: TSocketNotifyEvent;
  protected
    FSocket: TSocket;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Connect(Address: string; Port: integer);
    procedure Disconnect;

    function ReceiveBuffer(var Buffer; BufferSize: integer): integer;
    function ReceiveLength: integer;
    function SendBuffer(var Buffer; BufferSize: integer): integer;

    property Connected: boolean read FConnected;
    property Socket: TSocket read FSocket;
    property OnDisconnect: TSocketNotifyEvent read FOnDisconnect write FOnDisconnect; // eingefügt
  end;

jim_raynor 11. Dez 2004 16:21

Re: Router geht Offline, wie bekommt das ein ClientSocket mi
 
Zitat:

Zitat von PeterP.
Weil ein Freund von mir (C++ Programmierer) meinte, daß es mit Delphi nicht möglich sei einen Internet Chat Clienten kleiner als 200kb zu programmieren. Und sowas kann man ja nicht auf sich sitzen lassen.

Mhh. Dann solltest du mal nach nonVCL suchen. Damit kannst du auch Guis die kleiner als 200kb sind schreiben.

PeterP. 11. Dez 2004 16:27

Re: Router geht Offline, wie bekommt das ein ClientSocket mi
 
@jim_raynor
Danke für den Tip, aber lies dir doch mal mein Posting durch und schau dir die SocketUnit von mir mal an. Dann wirst du merken, daß das ganze schon ohne VCL auskommt. Und somit ja schon non-VCL ist. :wink:

thomasdrewermann 11. Dez 2004 16:31

Re: Router geht Offline, wie bekommt das ein ClientSocket mi
 
Dafür gehört zu seiner sehr kleinen C++ Anwendung auch immer noch die Runtime. Wenn man die mit eingrechnet, dann ist das Programm noch grosser als das selbe Programm in Delphi.

MFG
Thomas

PeterP. 14. Dez 2004 11:57

Re: Router geht Offline, wie bekommt das ein ClientSocket mi
 
@Thomas
Ich wollte hier nun keine C++ vs. Delphi Diskussion anleiern, sondern bin eigentlich nur auf der Suche nach einer Problemlösung.

Hat denn keiner eine Idee, wie ich das Problem am besten lösen kann ?

Kann mir denn einer sagen, ob die WinSock Funktion "select()" mir bei diesem Problem weiterhelfen kann ?


mfg
PeterP.

jim_raynor 14. Dez 2004 12:34

Re: Router geht Offline, wie bekommt das ein ClientSocket mi
 
Zitat:

Zitat von PeterP.
@jim_raynor
Danke für den Tip, aber lies dir doch mal mein Posting durch und schau dir die SocketUnit von mir mal an. Dann wirst du merken, daß das ganze schon ohne VCL auskommt. Und somit ja schon non-VCL ist. :wink:

Mir gings auch nur daraum, dass du den Chat in der Konsole machst. Mit nonVCL meine ich also normale Windows-Formulare ohne die VCL ;)

fiasko 14. Dez 2004 12:36

Re: Router geht Offline, wie bekommt das ein ClientSocket mi
 
Hallo,

zu deinem Problem:

Wenn die Verbindung unterbrochen wird hast du keine Chance das mitzubekommen, erst wenn Packete gesendet werden kann ein Router so net sein und ICMP Packete zurückschicken die deinem IP-Stack sagen das die Verbindung wech ist. Dein Router scheint ein imho dummes Exemplar zu sein wenn er einfach die schon laufende TCP-Verbindung auf eine neue IP maskiert, eigentlich sollten beim offline gehen alle Verbindungen entfernt werden (und TCP Packete (ich nehme jetzt mal an du verwendest TCP) ohne SYN Flag zu maskieren halte ich im Heimbereich für sehr fragwürdig). Du könntest also höchstens dummy Packete senden um es so eher mitzubekommen, eine ordentliche Lösung sehe ich aber nicht.

SubData 14. Dez 2004 12:56

Re: Router geht Offline, wie bekommt das ein ClientSocket mi
 
Ich denke mal nicht, dass sein Router bereits laufende Pakete neu maskiert sondern eher, dass sein Router bei einer einfachen Anfrage ans Internet einfach die Verbindung neu aufbaut...
Also ich kenne keinen Router, bei dem man einen Verbindungszusammenbruch mitbekommt vom Client her, wenn ich darüber nachdenke, dass ICQ, MSN, Trillian, Opera, Java, etc. alle nicht mitbekommen, wenn die Verbindung weg ist, würd ich sagen es ist imho nicht möglich :)

Man könnte allerdings einfach den Router fragen, wie die aktuelle WAN IP ist, dann dürfte klar sein ob noch ne Verbindung da ist...

jensw_2000 14. Dez 2004 14:00

Re: Router geht Offline, wie bekommt das ein ClientSocket mi
 
Schau doch mal, ob du nicht ggf. per SNMP den Online-Status des Routers abfragen kannst.
Das wäre nicht unüblich ...

Schöne Grüße,
Jens

PeterP. 14. Dez 2004 14:02

Re: Router geht Offline, wie bekommt das ein ClientSocket mi
 
@jim_raynor
was bedeutet denn "VCL" ? richtig: Visual Component Library.
Ist eine Konsole eine "Visuelle Komponenten Bibliothek" ?
Und wenn du dir ein Fenster ohne die VCL "FORMS" erstellst und dann die Unit "Scktcmp" benutzt, dann ist es in meinen Augen kein "non-VCL" mehr. Denk mal drüber nach und hau nicht mit Begriffen um dich, dessen Bedeutung du nicht ganz genau hinterfragt hast.
Mir ist natürlich vollkommen klar, dass man Windows Fenster nur mit der WinAPI erstellen kann. Aber es ist momentan total belanglos, ob mein Client nun ein richtiges Fenster hat oder nur ne simple Konsole ist.


@fiasko
Könntest du mir das mit dem SYN Flag mal erklären ?
Also warum, wofür und wann man sowas anwendet ?

Zitat:

Also ich kenne keinen Router, bei dem man einen Verbindungszusammenbruch mitbekommt vom Client her, wenn ich darüber nachdenke, dass ICQ, MSN, Trillian, Opera, Java, etc. alle nicht mitbekommen, wenn die Verbindung weg ist, würd ich sagen es ist imho nicht möglich
Das ist doch mal eine Aussage mit der man was anfangen kann.

Mir ist aufgefallen, dass Trillian das so erkennt:
-Verbindung zu ICQ besteht mit Trillian
-Router trennt nach Timeout (zum Beispiel nach 10 sek ohne Datentransfer. NUR zum Beispiel)
-Trillian schickt irgendwann immer mal ein Packet nach ICQ (Keep Alive Packet ???), und wenn keine ordentliche Antwort (FLAP/SNAC Header) auf dieses Packet kommt, dann verbindet er neu mit ICQ. Der Router baut aber schon beim Senden des (Keep Alive)-Packets die Verbindung auf.

Also ist meine einzige Möglichkeit auch so eine Art "Keep Alive" einzubauen ?


mfg
PeterP.

SubData 14. Dez 2004 14:19

Re: Router geht Offline, wie bekommt das ein ClientSocket mi
 
Also es gibt verschiedene Möglichkeiten einer Prüfung... MSN hat beispielsweise eine statische Verbindung offen (Sonst wäre es nicht möglich Dateien trotz Router zu empfangen, ausser bei forwarding etc.) und wenn eine gewisse Zeit keine Daten über diese Verbindung kommen wird ein Timeout ausgelöst... Das gleiche Prinzip verwenden WebChats, allerdings sind die WebBrowser alle zu doof um den Zusammenbruch mitzubekommen (Manchmal ja, manchmal nein).
Wenn also für eine gewisse Zeit keine Daten mehr reinkommen bei einem geöffneten Socket, sofern der Server stetig Daten sendet, kann man davon ausgehen, dass die Verbindung verloren wurde.

Die Router sind nämlich leider zu doof einfach die Sockets alle zu schließen, wenn die WAN Verbindung ausfällt.

Man entschuldige die bescheidene Schreibweise, ich brauch Urlaub :mrgreen:

Edit: Die Aussage aus meinem vorherigen Posting, dass die Clients es garnicht mitbekommen ist nicht richtig... Sie merken es halt erst wenn der Timeout ausläuft.

Edit2:
Zitat:

Also ist meine einzige Möglichkeit auch so eine Art "Keep Alive" einzubauen ?
Ja

PeterP. 14. Dez 2004 14:52

Re: Router geht Offline, wie bekommt das ein ClientSocket mi
 
Danke SubData, du hast mich auf eine Idee gebracht das umzusetzen.
Ich lass den Server einfach alle x sekunden ein "IsOnline" Packet schicken und im Clienten alle y sekunden prüfen, ob ein Packet empfangen wurde, wenn nicht dann CloseSocket.



mfg
PeterP.

SubData 14. Dez 2004 14:56

Re: Router geht Offline, wie bekommt das ein ClientSocket mi
 
Jop das is ne brauchbare Idee... Allerdings würde ich die "Fehlerbehandlung" auf 2 Pakete setzen.. d.H. wenn 2 Pakete nich ankommen, dann würde ich den Socket schließen (Es kann immerhin immer mal passieren, dass n Paket verloren geht)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz