Seite 1 von 1

SocketConnect Timeout

Verfasst: Mi, 22. Dez 2021 15:56
von Bernd Reinhardt
Hallo.
Mein Kunde hat Barcodeleser die ich zyklisch über Socket abfrage. Jeder Leser hat seine eigene IP.
Verkürzt gesagt: Socket connect - Verbindung steht - schicke Anfrage - erhalte Antwort - Socket schließen.
Ca. alle 3 sec wird der Leser abgefragt. Funktioniert seit ca. 1,5 Jahren problemlos.

Nun kam der Kunde auf die Idee das ich eine Meldung schicken soll, sobald ein Leser nicht erreichbar ist. Ich zähle die Fehlversuche und wenn 4 Fehlversuche hintereinander erreicht sind, dann kommt die Meldung: Leser nicht erreicht.

Auch das geht, aber es dauert bis zu 3 min. bis diese Meldung kommt, d. h. der Socketconnect hängt ca. 30 sec wenn der Teilnehmer nicht erreichbar ist.
Gibt es eine Möglichkeit diese Zeit zu verkürzen (5 sec) oder gibt es eine andere Möglichkeit zu erkennen ob die IP-Adresse erreicht werden kann.
So eine Art Ping.
Ich verwende aktuell 1.9.1 könnte beim Kunden aber auch auf 2.0 upgraden.
Wenn ich das auf meinem PC mit z. B. Hercules (Terminalprogramm) test, dann kommt die Meldung viel schneller.
Alle Rechner laufen unter WIN10.
Kunde hat einen guten Administrator, das Netz läuft zuverlässig und stabil.

Bin für jeden Rat dankbar.
Gruß
Bernd Reinhardt

Re: SocketConnect Timeout

Verfasst: Mi, 22. Dez 2021 17:48
von Werner_Bayern
Servus Bernd,

SocketSetBlockingMode auf .f. setzen, dann hast es selber in der Hand.

Re: SocketConnect Timeout

Verfasst: Mi, 22. Dez 2021 21:18
von Bernd Reinhardt
Hallo Werner

Danke für die rasche Antwort.
Ich setzte SocketBlockingMode nachem ich die Verbindung aufgebaut hat.
Mit geht es hier um den Verbindungsaufbau.
Mit SocketNew erzeuge ich den neuen Socket. Das geht quasi immer.
Mit SocketConncet verbinde ich mich mit dem externen Barcodeleser über die IP-Adresse und den Port.
Das geht alles auch sehr schnell und zuverlässig wenn der Barcodeleser im Netzwerk ist.
Wenn aber der Teilnehmer (IP) nicht im Netzwerk ist, dann dauert das SocketConnect sehr lange.
Beeinflusst der BlockingMode auch die Zeit von dem Verbindungsaufbau oder steuert das nur das "Warten auf Daten" wenn die Verbindung bereits steht?

Ich möchte halt sehr schnell erkennen ob der Barcodeleser noch im Netzwerk ist.

Gruß
Bernd

Code: Alles auswählen

nVersuche := 0
      do while nVersuche++ < 2
         nError := 0
         nSocket = SocketNew( , SOCK_STREAM, , @nError)
         cAusgabe := "Socketnew Ausgabe Errcode-" + alltrim(str(nError)) + "  Socket- " + alltrim(str(nSocket)) + CRLF + cAusgabe
         if nError = 0
            lSuccess = SocketConnect(nSocket, , cIP, nPort, @nError)    
            if nError <> 0            
               lSuccess := socketShutDown(nSocket, SD_BOTH, @nError)
               if lSuccess
               endif
               Socketclose(nSocket)
               nSocket := -1
               cAusgabe := "ERROR: SocketConnect failed IP-" + cIP + CRLF + cAusgabe
               sleep(10)
            else
               cAusgabe := "SocketConnect Errorcode-" + alltrim(str(nError)) + " Port-" +  alltrim(str(nPort,6)) + "  IP-" + cIP +  CRLF + cAusgabe           
               lWeiter := .T.
               exit
            endif
         else
            cAusgabe := "ERROR: Socket failed IP-" + cIP + CRLF + cAusgabe
         endif
      enddo 

Re: SocketConnect Timeout

Verfasst: Mi, 22. Dez 2021 21:44
von Jan
Hallo Bernd,

ich hab mal für eine Kunden ein Progrämmchen geschrieben, das eine Liste vorgegebener IP abarbeitet. Schlicht um festzustellen ob die noch anpingbar sind oder nicht. Wäre das vielleicht ein Lösungsansatz für Dich? Das geht ziemlich flott, nie mehr als 1 Sekunde je IP.

Jan

Re: SocketConnect Timeout

Verfasst: Do, 23. Dez 2021 6:39
von Wolfgang Ciriack
Gibt es nicht Werte für SendTimeout und ReceiveTimeout zu setzen wie bei xb2.net ?

Re: SocketConnect Timeout

Verfasst: Do, 23. Dez 2021 13:39
von Werner_Bayern
Servus Bernd,

nein, SocketSetBlockingMode wirkt erst für den Datentransfer, nicht für den Verbindungsaufbau. Habs gerade getestet, ein SocketConnect mit einem falschen Port dauert bei mir ca. 20 Sekunden, bis ich den Timeout bekomme. Obs da eine Einstellung dafür gibt, weiß ich nicht. In der Hilfe steht nichts darüber. Musst mal bei Alaska nachfragen.

Aber evtl. hilft Dir SocketSelect nach dem Connect?

Re: SocketConnect Timeout

Verfasst: Do, 23. Dez 2021 16:30
von Marcus Herz
Ich denke, timeout, das sind einstellungen aus system-netzwerk von windows. Da hat alaska keinen Einfluss

Re: SocketConnect Timeout

Verfasst: Sa, 24. Sep 2022 12:53
von Bernd Reinhardt
Hallo Jan

Aufgrund etwas anderer Probleme wurde der Timeout etwas nach hinten gestellt. Allerdings sind in den letzten Tagen bei dem Kunden wieder Kartenleser ausgefallen und das Programm hängt dann erst mal sehr lange.
So ein Tool, welches die IP-Adresse vor dem Aufbau prüft wäre für diesen Fall sicherlich eine gute Lösung.
Wie ist da der Lösungsansatz?
Bin für jeden Hinweis dankbar.

Gruß
Bernd

Re: SocketConnect Timeout

Verfasst: Sa, 24. Sep 2022 13:10
von Jan
Hallo Bernd,

da gab es mal einen alten Thread unter https://www.xbaseforum.de/viewtopic.php ... nt#p129271, wo es darum ging. Hier noch mal der Code, der dabei heraus gekommen war:

Code: Alles auswählen

*****************************************************************************************************************************************************
/// <summary>
///  <para>
///    <bold>Zweck:</bold> Ein Ping senden
///  </para>
///  <para>
///    <bold>Parameter:</bold> IP-Adresse (geht nicht auf URL, nur IP)
///  </para>
/// </summary>
/// <returns>
///  NIL
/// </returns>
///
FUNCTION myPing(cHost)

LOCAL nDst := 0
LOCAL nHop := 0
LOCAL nRTT := 0
LOCAL nReturn := 0

nDst    := inet_addr(cHost)  && google.com
nReturn := GetRTTAndHopCount(nDst, @nHop, 50, @nRTT)

IF nReturn <> 0                                                                                    // Bei <> 0 war der Ping erfolgreich
   RETURN .T.

 ELSE
   RETURN .F.
ENDIF

RETURN .F.

DLLFunction GetRTTAndHopCount(DestIpAddress, @HopCount, MaxHops, @RTT) USING STDCALL FROM IPHLPAPI.DLL
DLLFUNCTION inet_addr(cIP) USING STDCALL FROM wsock32.DLL
Müsste man wohl mal auf EXTERN umschrieben, um aktuell zu bleiben. Aber klappt auch so ohne Probleme.

Jan

Re: SocketConnect Timeout

Verfasst: So, 25. Sep 2022 2:28
von Werner_Bayern
Umsetzung auf 2.0 und EXTERN:

https://www.xbaseforum.de/viewtopic.php ... 48#p143048

IF nReturn <> 0 // Bei <> 0 war der Ping erfolgreich
RETURN .T.

ELSE
RETURN .F.
ENDIF

RETURN .F.
[-X
==> 1 Zeile:

Code: Alles auswählen

return .not. nReturn == 0

Re: SocketConnect Timeout

Verfasst: Mo, 26. Sep 2022 5:25
von Jan
Hallo Werner,

ich mache bei Ziffern niemals einen Exakt Gleich Vergleich. Das ght zu oft schief wegen der systembedingten Rundungsfehler.

Jan

Re: SocketConnect Timeout

Verfasst: Di, 27. Sep 2022 0:44
von Werner_Bayern
Servus Jan,

erstens gings mir darum, aus 6 (teils unsinnigen) Zeilen Code eine Zeile zu machen und zweitens: Der Rückgabewert kommt von einer Windows-DLL mit dem Rückgabewert Bool - also 0 oder 1. Da wird nichts gerundet.