SocketConnect Timeout

Sonstiges (nicht kategorisierbar)

Moderator: Moderatoren

Antworten
Bernd Reinhardt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 159
Registriert: So, 16. Apr 2006 11:12
Wohnort: Öhringen

SocketConnect Timeout

Beitrag 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
Bernd Reinhardt
fa.reinhardt@gmx.de
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: SocketConnect Timeout

Beitrag von Werner_Bayern »

Servus Bernd,

SocketSetBlockingMode auf .f. setzen, dann hast es selber in der Hand.
es grüßt

Werner

<when the music is over, turn off the lights!>
Bernd Reinhardt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 159
Registriert: So, 16. Apr 2006 11:12
Wohnort: Öhringen

Re: SocketConnect Timeout

Beitrag 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 
Bernd Reinhardt
fa.reinhardt@gmx.de
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: SocketConnect Timeout

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: SocketConnect Timeout

Beitrag von Wolfgang Ciriack »

Gibt es nicht Werte für SendTimeout und ReceiveTimeout zu setzen wie bei xb2.net ?
Viele Grüße
Wolfgang
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: SocketConnect Timeout

Beitrag 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?
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: SocketConnect Timeout

Beitrag von Marcus Herz »

Ich denke, timeout, das sind einstellungen aus system-netzwerk von windows. Da hat alaska keinen Einfluss
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Bernd Reinhardt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 159
Registriert: So, 16. Apr 2006 11:12
Wohnort: Öhringen

Re: SocketConnect Timeout

Beitrag 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
Bernd Reinhardt
fa.reinhardt@gmx.de
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: SocketConnect Timeout

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: SocketConnect Timeout

Beitrag 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
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: SocketConnect Timeout

Beitrag von Jan »

Hallo Werner,

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

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: SocketConnect Timeout

Beitrag 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.
es grüßt

Werner

<when the music is over, turn off the lights!>
Antworten