Announcement

Collapse

Forum Guidelines

This forum is for finished source code that is working properly. If you have questions about this or any other source code, please post it in one of the Discussion Forums, not here.
See more
See less

Enum active IP interfaces vi WSAIoctl

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Enum active IP interfaces vi WSAIoctl

    Hi there,

    below is a tiny sample for WSAIoctl. Prg should show all active
    interface IP with broadcast and subnet mask. Tested on NT4.

    rgds
    Ralph

    Code:
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' ipTest.bas
    ' get list of all active ip adapters
    ' based on MS intrfc.cpp - implified mem handling
    
    
    #DIM ALL
    #COMPILE EXE
    #OPTION VERSION4
    #REGISTER NONE
    
    #INCLUDE "win32api.inc"
    #INCLUDE "wsock32.inc"
    
    
    DECLARE FUNCTION WSASocket LIB "ws2_32.dll" ALIAS "WSASocketA" (BYVAL af AS LONG, BYVAL ltype AS LONG, BYVAL protocol AS LONG, lpProtocolInfo AS DWORD, BYVAL g AS DWORD, BYVAL dwFlags AS DWORD) AS DWORD
    DECLARE FUNCTION WSAIoctl LIB "ws2_32.dll" ALIAS "WSAIoctl" (s AS DWORD, BYVAL dwIoControlCode AS DWORD, BYVAL lpvInBuffer AS DWORD, BYVAL cbInBuffer AS DWORD, BYVAL lpvOutBuffer AS DWORD, BYVAL cbOutBuffer AS DWORD, _
        lpcbBytesReturned AS DWORD, lpOverlapped AS DWORD, BYVAL lpCompletionRoutine AS DWORD) AS LONG
    
    
    FUNCTION ip2str ( BYVAL s_in AS STRING ) AS STRING
       IF LEN(s_in) <> 4 THEN
          FUNCTION = "0.0.0.0"
          EXIT FUNCTION
       END IF
       
       FUNCTION = FORMAT$(ASC(LEFT$(s_in,1)))  + "." + _
                  FORMAT$(ASC(MID$(s_in,2,1))) + "." + _
                  FORMAT$(ASC(MID$(s_in,3,1))) + "." + _
                  FORMAT$(ASC(RIGHT$(s_in,1)))
    
    END FUNCTION
       
    
    %SIO_GET_INTERFACE_LIST = &H4004747F
    %INTERFACE_RECLEN       = 76
    
    FUNCTION doit() AS LONG
    
       LOCAL sd AS DWORD
       LOCAL nBytesReturned AS DWORD
       LOCAL i  AS LONG
       LOCAL lerr AS LONG
       LOCAL lReturn AS LONG
       LOCAL nNumInterfaces AS INTEGER
       LOCAL sDisplay AS STRING
       LOCAL sBuff AS STRING * 760                   '' allow max 10 interfaces
    
        sd   = WSASocket(%AF_INET, %SOCK_DGRAM, 0, BYVAL 0, 0, 0)
        IF sd = %SOCKET_ERROR THEN EXIT FUNCTION
    
        lReturn = WSAIoctl(BYVAL sd, %SIO_GET_INTERFACE_LIST, 0, 0, VARPTR( sBuff ), _
                           LEN(sBuff), nBytesReturned, BYVAL 0, BYVAL 0 )
        lerr    = WSAGetLastError()
        IF lreturn = %SOCKET_ERROR THEN
           MSGBOX "lReturn " + $TAB + STR$( lreturn ) + $CRLF + "lerr " + $TAB + STR$( lerr ),,"WSAIoctl"
           EXIT FUNCTION
        END IF
    
    
        nNumInterfaces =  INT( nBytesReturned / %INTERFACE_RECLEN )
        sDisplay       = "There are " + STR$( nNumInterfaces ) + " interfaces" + $CRLF
    
        FOR i = 0  TO nNumInterfaces-1
            sDisplay = sDisplay + ip2str( MID$(sBuff, i * %INTERFACE_RECLEN + 9, 4) )
            sDisplay = sDisplay + " has bcast " + ip2str( MID$(sBuff, i * %INTERFACE_RECLEN + 33, 4) )
            sDisplay = sDisplay + " and netmask " + ip2str( MID$(sBuff, i * %INTERFACE_RECLEN + 57, 4) ) + $CRLF
        NEXT i
        MSGBOX sDisplay
        FUNCTION = %true
    
    END FUNCTION
    
    
    FUNCTION PBMAIN()
        LOCAL WinsockData AS WSADATA
        LOCAL nRetVal AS LONG
    
        IF WSAStartup( MAKDWD( 2, 2 ), WinsockData) <> 0 THEN
          MSGBOX "Failed to find Winsock 2.2!"
          EXIT FUNCTION
        END IF
    
        nRetVal = doit()
        WSACleanup
    
        FUNCTION = nRetVal
    
    END FUNCTION
    ------------------

    #2
    Pls let me know if there's any problem under W2K oder Windows ME.

    Ralph

    ------------------

    Comment


      #3
      This works fine for me on Win2k.
      Best Regards,
      Don

      ------------------
      Don Dickinson
      www.greatwebdivide.com

      Comment


        #4
        Don,

        replaced ip2str with inet_ntoa. inet_ntoa didn't work yesterday
        because i forgot closesocket and wsaCleanup.

        Ralph

        Code:
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ' ipTest2.bas
        ' get list of all active ip adapters
        ' based on MS intrfc.cpp - simplified mem handling
        
        
        #DIM ALL
        #COMPILE EXE
        #OPTION VERSION4
        #REGISTER NONE
        
        #INCLUDE "win32api.inc"
        #INCLUDE "wsock32.inc"
        
        
        DECLARE FUNCTION WSASocket LIB "ws2_32.dll" ALIAS "WSASocketA" (BYVAL af AS LONG, BYVAL ltype AS LONG, BYVAL protocol AS LONG, lpProtocolInfo AS DWORD, BYVAL g AS DWORD, BYVAL dwFlags AS DWORD) AS DWORD
        DECLARE FUNCTION WSAIoctl LIB "ws2_32.dll" ALIAS "WSAIoctl" (s AS DWORD, BYVAL dwIoControlCode AS DWORD, BYVAL lpvInBuffer AS DWORD, BYVAL cbInBuffer AS DWORD, BYVAL lpvOutBuffer AS DWORD, BYVAL cbOutBuffer AS DWORD, _
            lpcbBytesReturned AS DWORD, lpOverlapped AS DWORD, BYVAL lpCompletionRoutine AS DWORD) AS LONG
        
        
        %SIO_GET_INTERFACE_LIST = &H4004747F
        %INTERFACE_RECLEN       = 76
        %IP_Len                 = 4
        
        FUNCTION doit() AS LONG
        
            LOCAL sd AS DWORD
            LOCAL nBytesReturned AS DWORD
            LOCAL i  AS LONG
            LOCAL lerr AS LONG
            LOCAL lReturn AS LONG
            LOCAL nNumInterfaces AS INTEGER
            LOCAL sDisplay AS STRING
            LOCAL sBuff AS STRING * 760                   '' allow max 10 interfaces
            LOCAL pszHost AS ASCIIZ PTR
        
            sd    = WSASocket(%AF_INET, %SOCK_DGRAM, 0, BYVAL 0, 0, 0)
            IF sd = %SOCKET_ERROR THEN EXIT FUNCTION
        
            lReturn = WSAIoctl(BYVAL sd, %SIO_GET_INTERFACE_LIST, 0, 0, VARPTR( sBuff ), _
                               LEN(sBuff), nBytesReturned, BYVAL 0, BYVAL 0 )
            lerr    = WSAGetLastError()
            IF lreturn = %SOCKET_ERROR THEN
               MSGBOX "lReturn " + $TAB + STR$( lreturn ) + $CRLF + "lerr " + $TAB + STR$( lerr ),,"WSAIoctl"
               EXIT FUNCTION
            END IF
        
            closesocket sd
            WSACleanup
            
            nNumInterfaces = INT( nBytesReturned / %INTERFACE_RECLEN )
            sDisplay       = "There are " + STR$( nNumInterfaces ) + " interfaces" + $CRLF
        
            FOR i = 0  TO nNumInterfaces-1
                
                ''' ip
                pszHost  = inet_ntoa( CVL( MID$(sBuff, i * %INTERFACE_RECLEN + 9, %IP_Len )))
                sDisplay = sDisplay + @pszHost
                
                ''' bcast
                pszHost  = inet_ntoa( CVL( MID$(sBuff, i * %INTERFACE_RECLEN + 33, %IP_Len )))
                sDisplay = sDisplay + " has bcast " + @pszHost
                
                ''' netmask
                pszHost  = inet_ntoa( CVL( MID$(sBuff, i * %INTERFACE_RECLEN + 57, %IP_Len )))
                sDisplay = sDisplay + " and netmask " + @pszHost + $CRLF
              
            NEXT i
            
            MSGBOX sDisplay
            FUNCTION = %true
        
        END FUNCTION
        
        
        FUNCTION PBMAIN()
            LOCAL WinsockData AS WSADATA
            LOCAL nRetVal AS LONG
        
            IF WSAStartup( MAKDWD( 2, 2 ), WinsockData) <> 0 THEN
              MSGBOX "Failed to find Winsock 2.2!"
              EXIT FUNCTION
            END IF
        
            nRetVal = doit()
            WSACleanup
        
            FUNCTION = nRetVal
        
        END FUNCTION
        ------------------

        Comment


          #5
          Hi there,

          below is a real live example of wsaIOCTL. We use it for
          UDP Bcasts to a local subnet.

          rgds
          Ralph
          Code:
          ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
          ' file : udp_SubN.bas
          ' why  : udp broadcast to subnet
          '        raw broadcast works on W2K only with ADMIN privileges
          ' proj.: Replace DCOM with pure sockets
          
          #DIM ALL
          #COMPILE EXE
          #OPTION VERSION4
          #REGISTER NONE
          
          #INCLUDE "win32api.inc"
          #INCLUDE "wsock32.inc"
          
          
          DECLARE FUNCTION WSASocket LIB "ws2_32.dll" ALIAS "WSASocketA" (BYVAL af AS LONG, BYVAL ltype AS LONG, BYVAL protocol AS LONG, lpProtocolInfo AS DWORD, BYVAL g AS DWORD, BYVAL dwFlags AS DWORD) AS DWORD
          DECLARE FUNCTION WSAIoctl LIB "ws2_32.dll" ALIAS "WSAIoctl" (s AS DWORD, BYVAL dwIoControlCode AS DWORD, BYVAL lpvInBuffer AS DWORD, BYVAL cbInBuffer AS DWORD, BYVAL lpvOutBuffer AS DWORD, BYVAL cbOutBuffer AS DWORD, _
              lpcbBytesReturned AS DWORD, lpOverlapped AS DWORD, BYVAL lpCompletionRoutine AS DWORD) AS LONG
          
          %IP_Len                 = 4
          %INTERFACE_RECLEN       = 76
          %SIO_GET_INTERFACE_LIST = &H4004747F
          
          FUNCTION UDP_BCAST_ADDR ( BYVAL ip_search AS LONG ) AS LONG
          
              LOCAL sd       AS DWORD
              LOCAL dwCount  AS DWORD
              LOCAL i        AS LONG
              LOCAL lReturn  AS LONG
              LOCAL sBuff    AS STRING * 760                 '' allow max 10 interfaces
              DIM netmask(4) AS LOCAL BYTE
              DIM ip(4)      AS LOCAL BYTE
          
              ''' read socket
              sd    = WSASocket(%AF_INET, %SOCK_DGRAM, 0, BYVAL 0, 0, 0)
              IF sd = %SOCKET_ERROR THEN EXIT FUNCTION
              lReturn = WSAIoctl(BYVAL sd, %SIO_GET_INTERFACE_LIST, 0, 0, VARPTR( sBuff ), LEN(sBuff), dwCount, BYVAL 0, BYVAL 0 )
              closesocket sd
              WSACleanup
              IF lReturn = %SOCKET_ERROR THEN EXIT FUNCTION
          
              ''' search ip adapter in sBuff - exit if not found
              dwCount = INT( dwCount / %INTERFACE_RECLEN )
              FOR i = 0  TO dwCount - 1
                  IF CVL( MID$(sBuff, i * %INTERFACE_RECLEN + 9, %IP_Len )) = ip_search THEN EXIT
              NEXT
              IF i = dwCount THEN EXIT FUNCTION '' returns 0
          
              ''' copy from sBuff to netmask() and ip()
              MoveMemory VARPTR( netmask(1) ), VARPTR( sBuff) + i * %INTERFACE_RECLEN + 56, %IP_Len
              MoveMemory VARPTR( ip(1) ), VARPTR( sBuff) + i * %INTERFACE_RECLEN + 8, %IP_Len
              
              ''' create broadcast addr. for subnet
              FOR i = 1 TO 4
                 IF netmask(i) <> 255 THEN ip(i) = 255
              NEXT
              MoveMemory VARPTR( lreturn ), VARPTR( ip(1) ), %IP_Len
              FUNCTION = lreturn
          
          END FUNCTION
          
          
          FUNCTION PBMAIN()
             
              LOCAL WinsockData AS WSADATA
              LOCAL pcName AS ASCIIZ * 255
              LOCAL pszHost AS ASCIIZ PTR
              LOCAL display AS STRING
              LOCAL nRetVal AS LONG
              LOCAL retval AS LONG
              LOCAL hfile AS LONG
              LOCAL ip AS LONG
          
              IF WSAStartup( MAKDWD( 2, 2 ), WinsockData) <> 0 THEN
                 MSGBOX "Failed to find Winsock 2.2!"
                 EXIT FUNCTION
              END IF
          
              GetComputerName pcName, SIZEOF( pcName )
              
              HOST ADDR pcName TO ip
              pszHost = inet_ntoa( ip )
              
              display = "PC Name " + $TAB + pcName + $CR + _
                        "1st IP Addr." + $TAB + @pszHost + $CR
          
              ip = UDP_BCAST_ADDR( ip )
              pszHost = inet_ntoa( ip )
              
              display = display + "BCast for Subnet " + $TAB + @pszHost + $CR + $CR
              display = display + $TAB + "Try UDP send ?"
              IF MSGBOX( display,%MB_YESNO,"Find broadcast for SubNet" ) = %IDNO THEN EXIT FUNCTION
              
              hfile = FREEFILE
          
              UDP OPEN  AS hfile
              UDP SEND  hfile, AT ip, 87, "Hi:"+@pszHost
              UDP CLOSE hfile
              
              WSACleanup
              
              MSGBOX "Done !"
              
              ''' TCP Listen for Servers
              ''' pick that one with lowest load OR start local server
              
          END FUNCTION
          ------------------

          Comment


            #6
            See post in Programming for my error.


            ------------------
            Scott
            mailto:[email protected][email protected]</A>
            Scott Turchin
            MCSE, MCP+I
            http://www.tngbbs.com
            ----------------------
            True Karate-do is this: that in daily life, one's mind and body be trained and developed in a spirit of humility; and that in critical times, one be devoted utterly to the cause of justice. -Gichin Funakoshi

            Comment


              #7
              Example show to Local Broadcast (all net).
              And to get Direct Broadcast (subnet only)?

              How to do a server (TCP or UDP) that listen and answer
              a broadcast message ?
              Any especial or a simple server at any port ?

              Comment


                #8
                To get the program to compile and run, I had to go to each of the
                MoveMemory statements and preface the VARPTR with BYVAL in order
                to avoid getting a Variable Expected compiler error.

                ------------------
                Old Navy Chief, Systems Engineer, Systems Analyst, now semi-retired

                Comment

                Working...
                X
                😀
                🥰
                🤢
                😎
                😡
                👍
                👎