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.