Network Connection Monitor

Share your advanced PureBasic knowledge/code with the community.
peterb
User
User
Posts: 60
Joined: Sun Oct 02, 2005 8:55 am
Location: Czech Republic
Contact:

Network Connection Monitor

Post by peterb »

Enjoy

peterb

Code: Select all

;- Author   : Petr Vavrin (peterb)
;- Location : Czech Republic
;- Email    : pb.pb@centrum.cz 

#TCP_TABLE_OWNER_PID_ALL  = 5
#UDP_TABLE_OWNER_PID      = 1 
#AF_INET                  = 2

Structure MIB_TCPROW 
  dwStats.l 
  dwLocalAddr.l 
  dwLocalPort.l 
  dwRemoteAddr.l 
  dwRemotePort.l 
EndStructure 

Structure MIB_TCPTABLE 
  dwNumEntries.l 
  table.MIB_TCPROW[2048] 
EndStructure 

Structure MIB_UDPROW 
  dwLocalAddr.l 
  dwLocalPort.l 
EndStructure 

Structure MIB_UDPTABLE 
  dwNumEntries.l 
  table.MIB_UDPROW[2048] 
EndStructure 

Structure MIB_TCPTABLE_OWNER_PID 
  dwStats.l 
  dwLocalAddr.l 
  dwLocalPort.l 
  dwRemoteAddr.l 
  dwRemotePort.l 
  dwOwningPid.l 
EndStructure 

Structure MIB_TCPTABLE_EX
  dwNumEntries.l 
  table.MIB_TCPTABLE_OWNER_PID[2048] 
EndStructure 

Structure MIB_UDPTABLE_OWNER_PID 
  dwLocalAddr.l 
  dwLocalPort.l 
  dwOwningPid.l 
EndStructure 

Structure MIB_UDPTABLE_EX
  dwNumEntries.l 
  table.MIB_UDPTABLE_OWNER_PID[2048] 
EndStructure 

Structure TCPUDPTABLE
  Type.b
  LocalAddr.l 
  LocalPort.l 
  RemoteAddr.l 
  RemotePort.l 
  PID.l
  Stats.l
  SystemTime.SYSTEMTIME
EndStructure

Enumeration
  #iphlpapi
EndEnumeration

Define tcpTableEx.MIB_TCPTABLE_EX
Define udpTableEx.MIB_UDPTABLE_EX
Define tcpTable.MIB_TCPTABLE
Define udpTable.MIB_UDPTABLE

Global NewList tcp_udp.TCPUDPTABLE()
Global NewList last_tcp_udp.TCPUDPTABLE()
Global iphlpapi_loaded.l = #False

Global iphlpapi_loaded.l = #False
Global enable_TCP.l      = #True
Global enable_UDP.l      = #True

Global compare_size.l = SizeOf ( TCPUDPTABLE ) - SizeOf ( TCPUDPTABLE\Stats ) - SizeOf ( TCPUDPTABLE\SystemTime )

Procedure Open_IPHLPAPI ()

  If OpenLibrary ( #iphlpapi, "iphlpapi.dll" )
    iphlpapi_loaded = #True
  EndIf

EndProcedure

Procedure Close_IPHLPAPI ()

  If iphlpapi_loaded
    CloseLibrary ( #iphlpapi )
  EndIf
  
EndProcedure

Procedure Is_IPHLPAPI_loaded ()
  ProcedureReturn iphlpapi_loaded

EndProcedure

Procedure GetTcpAndUdpTable ()

  Shared tcpTableEx, udpTableEx
  Shared tcpTable, udpTable
  
  ClearList ( tcp_udp() ) 

  If GetFunction ( #iphlpapi, "GetExtendedTcpTable" )

    If enable_TCP
      dwSize = $0
      
      If CallFunction ( #iphlpapi, "GetExtendedTcpTable", @tcpTableEx, @dwSize, #True, #AF_INET, #TCP_TABLE_OWNER_PID_ALL, 0)
        If CallFunction ( #iphlpapi, "GetExtendedTcpTable", @tcpTableEx, @dwSize, #True, #AF_INET, #TCP_TABLE_OWNER_PID_ALL, 0) = #NO_ERROR 
          
          GetLocalTime_ ( @SystemTime.SYSTEMTIME )
          
          For cnt = 0 To tcpTableEx\dwNumEntries - 1 
            AddElement ( tcp_udp() )
            tcp_udp()\Type       = 1
            tcp_udp()\Stats      = tcpTableEx\table[cnt]\dwStats
            tcp_udp()\LocalAddr  = tcpTableEx\table[cnt]\dwLocalAddr
            tcp_udp()\LocalPort  = htons_(tcpTableEx\table[cnt]\dwLocalPort)
            tcp_udp()\RemoteAddr = tcpTableEx\table[cnt]\dwRemoteAddr
            tcp_udp()\RemotePort = htons_(tcpTableEx\table[cnt]\dwRemotePort)
            tcp_udp()\PID        = tcpTableEx\table[cnt]\dwOwningPid
            CopyMemory ( @SystemTime, @tcp_udp()\SystemTime, SizeOf ( SYSTEMTIME ) ) 
          Next 
  
        EndIf 
      EndIf 
    EndIf

    If enable_UDP
      dwSize = $0 
  
      If CallFunction ( #iphlpapi,"GetExtendedUdpTable", @udpTableEx, @dwSize, #True, #AF_INET, #UDP_TABLE_OWNER_PID,0) 
        If CallFunction ( #iphlpapi,"GetExtendedUdpTable", @udpTableEx, @dwSize, #True, #AF_INET, #UDP_TABLE_OWNER_PID,0) = #NO_ERROR 
  
          GetLocalTime_ ( @SystemTime.SYSTEMTIME )
          
          For cnt = 0 To udpTableEx\dwNumEntries - 1 
            AddElement ( tcp_udp() )
            tcp_udp()\Type       = 2
            tcp_udp()\LocalAddr  = udpTableEx\table[cnt]\dwLocalAddr
            tcp_udp()\LocalPort  = htons_(udpTableEx\table[cnt]\dwLocalPort)
            tcp_udp()\PID        = udpTableEx\table[cnt]\dwOwningPid
            CopyMemory ( @SystemTime, @tcp_udp()\SystemTime, SizeOf ( SYSTEMTIME ) ) 
          Next 
  
        EndIf 
      EndIf 
    EndIf

  Else

    If enable_TCP
      dwSize = $0
      
      If CallFunction ( #iphlpapi, "GetTcpTable", @tcpTable, @dwSize, #True) 
        If CallFunction ( #iphlpapi, "GetTcpTable", @tcpTable, @dwSize, #True) = #NO_ERROR 
  
          GetLocalTime_ ( @SystemTime.SYSTEMTIME )
  
          For cnt = 0 To tcpTable\dwNumEntries - 1 
            AddElement ( tcp_udp() )
            tcp_udp()\Type       = 1
            tcp_udp()\Stats      = tcpTable\table[cnt]\dwStats
            tcp_udp()\LocalAddr  = tcpTable\table[cnt]\dwLocalAddr
            tcp_udp()\LocalPort  = htons_(tcpTable\table[cnt]\dwLocalPort)
            tcp_udp()\RemoteAddr = tcpTable\table[cnt]\dwRemoteAddr
            tcp_udp()\RemotePort = htons_(tcpTable\table[cnt]\dwRemotePort)
            CopyMemory ( @SystemTime, @tcp_udp()\SystemTime, SizeOf ( SYSTEMTIME ) ) 
          Next 
  
        EndIf 
      EndIf 
    EndIf

    If enable_UDP
      dwSize = $0 
  
      If CallFunction ( #iphlpapi, "GetUdpTable", @udpTable, @dwSize, #True) 
        If CallFunction ( #iphlpapi, "GetUdpTable", @udpTable, @dwSize, #True) = #NO_ERROR
  
          GetLocalTime_ ( @SystemTime.SYSTEMTIME )
  
          For cnt = 0 To udpTable\dwNumEntries - 1 
            AddElement ( tcp_udp() )
            tcp_udp()\Type       = 2
            tcp_udp()\LocalAddr  = udpTable\table[cnt]\dwLocalAddr
            tcp_udp()\LocalPort  = htons_(udpTable\table[cnt]\dwLocalPort)
            CopyMemory ( @SystemTime, @tcp_udp()\SystemTime, SizeOf ( SYSTEMTIME ) ) 
          Next 
  
        EndIf 
      EndIf 
    EndIf
  EndIf

EndProcedure

Procedure CheckTable()

    ; add connection or modify connection
    ResetList ( tcp_udp()      ) 
    While NextElement ( tcp_udp() )
     
      found = #False
      ResetList ( last_tcp_udp() )
      While NextElement ( last_tcp_udp() )

        If CompareMemory ( @tcp_udp(), @last_tcp_udp(), compare_size )
          found = #True

          If Not last_tcp_udp()\Stats = tcp_udp()\Stats
            last_tcp_udp()\Stats = tcp_udp()\Stats
            Debug "modify - " + IPString (tcp_udp()\LocalAddr) + " - " + IPString (tcp_udp()\RemoteAddr)
          EndIf
          Break
        EndIf
      Wend      
      
      If found = #False
        Debug "add - " + IPString (tcp_udp()\LocalAddr) + " - " + IPString (tcp_udp()\RemoteAddr)
        AddElement ( last_tcp_udp() )
        CopyMemory ( @tcp_udp(), @last_tcp_udp(), SizeOf ( TCPUDPTABLE ) )
        found = #True
      EndIf
    Wend
    
    ; remove connection
    ResetList( last_tcp_udp() )
    While NextElement ( last_tcp_udp() )
      
      found = #False
      ResetList( tcp_udp() )
      While NextElement ( tcp_udp() )
        If CompareMemory ( @last_tcp_udp(), @tcp_udp(), compare_size )
          found = #True
          Break
        EndIf
      Wend      
      
      If found = #False
        Debug "remove - " + IPString (last_tcp_udp()\LocalAddr) + " - " + IPString (last_tcp_udp()\RemoteAddr)
        DeleteElement ( last_tcp_udp() )
        found = #True
      EndIf
    Wend

EndProcedure



Open_IPHLPAPI ()

loop = 1

Repeat 
  GetTcpAndUdpTable ( )
  CheckTable ( )
  Delay ( 100 )
  loop + 1
Until loop = 400