Re: IP auslesen

From: Hans-Peter Grözinger (hanspetergr_at_gmx.de)
Date: 11/25/04


Date: Thu, 25 Nov 2004 13:00:34 +0100

Hallo Simon !

> > Ich hab mir daraus z.B. ne Funktion gebastelt, die ein Array
> > mit allen IPs als String zurückgibt - das kann man dann schön
> > nach lokalen bzw. externen IPs filtern.
>
> Kannst du mir die Funktion vll mal zuschicken ?
> oder hier posten?

Auf die hat Alexander doch schon verwiesen. :-)

Hier also nochmals (in meiner Ausführung)

FUNCTION GetIP
**************

    DECLARE RtlMoveMemory IN kernel32 AS CopyMemory STRING @DEST, INTEGER Src, INTEGER nLength
    DECLARE INTEGER gethostbyname IN ws2_32 STRING cHost
    DECLARE STRING inet_ntoa IN ws2_32 INTEGER in_addr
    DECLARE INTEGER WSACleanup IN ws2_32
    DECLARE INTEGER WSAStartup IN ws2_32 INTEGER wVerRq, STRING lpWSAData

    #DEFINE HOSTENT_SIZE 16

    LOCAL lnStruct, lnSize, lcBuffer, lnAdress, lcIP

    *-- WinSock initialisieren
    IF WSAStartup( 0x202, REPLICATE( CHR( 0 ), 512 ) ) <> 0

        *-- Fehler, dann brechen wir ab
        RETURN( .F. )
    ENDIF

    *-- Host-Struktur holen
    lcHost = GETWORDNUM( SYS( 0 ), 1 )
    lnStruct = gethostbyname( lcHost )

    *-- Es konnte keine Namensauflösung durchgeführt werden
    IF lnStruct = 0

        *-- Leerstring als Fehlerindikator zurückgeben
        WAIT WINDOW 'Namensausflösung nicht möglich'
    ELSE
        *-- Parameter mit 0x0 füllen
        lcBuffer = REPLICATE( CHR( 0 ), HOSTENT_SIZE )
        lcIP = REPLICATE( CHR( 0 ), 4 )

        *-- IP-Adresse aus der Struktur lnStruct holen
        CopyMemory( @lcBuffer, lnStruct, HOSTENT_SIZE)
        CopyMemory( @lcIP, buf2dword( SUBSTR( lcBuffer, 13, 4 ) ), 4 )
        CopyMemory( @lcIP, buf2dword( lcIP ), 4 )
        lcIPString = inet_ntoa( buf2dword( lcIP ) )
        WAIT WINDOW lcIPString
    ENDIF

    *-- WinSock wieder freigeben
    WSACleanup()
RETURN

FUNCTION buf2dword( tcBuffer )
******************************

    RETURN ASC( SUBSTR( tcBuffer, 1, 1 ) ) + BITLSHIFT( ASC( SUBSTR( tcBuffer, 2, 1 ) ), 8 ) + ;
        BITLSHIFT( ASC( SUBSTR( tcBuffer, 3, 1 ) ), 16 ) + BITLSHIFT( ASC( SUBSTR( tcBuffer, 4, 1 ) ), 24 )

Diese Funktion benötigt aber auf jeden Fall die WS2_32.DLL (für
welche das wins***.ocx einen Wrapper bildet).

-- 
Hans-Peter Grözinger
TOFU ist gedankenlose Resourcenverschwendung. Siehe http://got.to/quote
http://support.microsoft.com/default.aspx?scid=fh;DE;NGNetikette