Seite 1 von 1
OpenNetworkConnection Timeout
Verfasst: 31.08.2012 14:05
von kunstlust
Gibt es ein Möglichkeit bei einer OpenNetworkConnection ein Timeout zu setzen.
Ich will nur sehen unter Windows ob der Client da ist, da ich diesen per SNMP Abfrage will, sollte er nicht erreichbar sein, dauert mir es so einfach zu lange, bevor ich vom objSNMP = COMate_CreateObject("OlePrn.OleSNMP") eine Rückmeldung bekommen, also dachte ich mache ich zuvor eine Abfrage per OpenNetworkConnection, doch schneller geht das auch nicht. Klar könnte unter Windows einen Consolenping nutzen, aber schön finde ich das nicht, einer ne Idee?
Re: OpenNetworkConnection Timeout
Verfasst: 31.08.2012 14:26
von RSBasic
Also ich kenn nur die Thread-Möglichkeit. Du fragst in einem eigenen Thread nach der IP und erstellst selber einen Timeout. Wenn beispielsweise 3 Sekunden abgelaufen sind und nicht 30 Sekunden, dann soll der Thread einfach gekillt werden. Scheint zwar unsauber zu sein mit dem eigenen Thread und mit dem Killen, aber ich wüsste nicht, wie man das anders lösen könnte.
Re: OpenNetworkConnection Timeout
Verfasst: 31.08.2012 14:47
von kunstlust
Das muss ich mir wohl damit leben, ich meine die SMTP Lib machte Threads Probleme, ich glaube aber das es schon eine andere Lösung für das SMPT Auth gegeben hat. Danke für den Tip
Re: OpenNetworkConnection Timeout
Verfasst: 31.08.2012 17:50
von Dark
Mit der Windows API ist sowas natürlich möglich. Ich habe mal einen kleinen Code geschrieben, der die gewünschte Funktion umsetzt:
Code: Alles auswählen
Macro FD_ZERO(set)
set\fd_count = 0
EndMacro
Procedure.i FD_SET(fd.i, *set.FD_SET)
If *set\fd_count < #FD_SETSIZE
*set\fd_array[ *set\fd_count ] = fd
*set\fd_count + 1
EndIf
EndProcedure
Procedure.i FD_ISSET(fd.i, *set.FD_SET)
Protected I.i
For I = *set\fd_count - 1 To 0 Step -1
If *set\fd_array[I] = fd
ProcedureReturn #True
EndIf
Next
ProcedureReturn #False
EndProcedure
CompilerIf Defined(TIMEVAL, #PB_Structure) = #False ;{
Structure TIMEVAL
tv_sec.l
tv_usec.l
EndStructure ;}
CompilerEndIf
Procedure TestConnectionTCP(IP.s, Port.i, Timeout.i) ;Timeout in ms
Protected ReturnValue.i = #False
Protected Socket.i = SOCKET_(#AF_INET, #SOCK_STREAM, #IPPROTO_TCP)
If Socket <> #INVALID_SOCKET
Protected mode.l = 1
If ioctlsocket_(Socket, #FIONBIO, @mode) = 0
Protected addr.sockaddr_in
addr\sin_family = #AF_INET
addr\sin_addr = inet_addr_(IP)
addr\sin_port = htons_(Port)
;Workaround for 64 bit, because connect_(...) = #SOCKET_ERROR fails
Protected ret.l = connect_(Socket, addr, SizeOf(sockaddr_in))
If ret = #SOCKET_ERROR And WSAGetLastError_() = #WSAEWOULDBLOCK
Protected writefds.fd_set, exceptfds.fd_set, tv.timeval
tv\tv_sec = 0
tv\tv_usec = Timeout * 1000
FD_ZERO(writefds)
FD_ZERO(exceptfds)
FD_SET(Socket, writefds)
FD_SET(Socket, exceptfds)
If select_(Socket+1, 0, @writefds, @exceptfds, @tv) > 0
If FD_ISSET(Socket, writefds)
ReturnValue.i = #True
EndIf
EndIf
EndIf
EndIf
closesocket_(Socket)
EndIf
ProcedureReturn ReturnValue
EndProcedure
InitNetwork()
Debug TestConnectionTCP("192.168.2.122", 80, 1000)
TestConnectionTCP() baut innerhalb des Timeouts (Angabe in Millisekunden) eine Verbindung zu der angegebenen IP (nur IPv4 unterstützt, DNS etc. sollte aber leicht nachzurüsten sein) und dem Port auf. Tritt ein Fehler auf oder kommt die Verbindung vor dem Timeout zu Stande, kehrt die Funktion sofort zurück.
Dark
OpenNetworkConnection Timeout
Verfasst: 31.08.2012 18:14
von kunstlust
Ich danke dir Dark, für den "kleine Code". Windows API aus PB ist nicht so einfache finde ich. Gibt es eigentlich eine Möglichkeit COM Objekte ohne Includes anzusteuern?
Re: OpenNetworkConnection Timeout
Verfasst: 31.08.2012 18:41
von Dark
Gibt es eigentlich eine Möglichkeit COM Objekte ohne Includes anzusteuern?
Klar kannst du auch die Windows API direkt benutzen um COM Objekte zu erzeugen, jedoch kann ich dir aus eigener Erfahrung sagen, das dies extrem umständlich und fehleranfällig ist.