PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Как получить маску сети?


Как получить маску сети?

Сообщений 1 страница 4 из 4

1

Для получения списка локальных IP-адресов есть мультиплатформенные функции

Код:
If ExamineIPAddresses(#PB_Network_IPv4)
  Repeat
    nIP = NextIPAddress()
    ....
    
  ForEver
EndIf

А как получить маску сетей этих адресов?
Предпочтительно мультиплатформенным способом.
Что-то я в хелпе не нашел.

0

2

Как правильно освободить память от *TableBroadcastAddr в след коде

Код

#MIB_IPADDR_PRIMARY = $0001
#MIB_IPADDR_DYNAMIC = $0004
#MIB_IPADDR_DISCONNECTED = $0008
#MIB_IPADDR_DELETED = $0040
#MIB_IPADDR_TRANSIENT = $0080

Structure MIB_IPADDRROW
   dwAddr.l
   dwIndex.l
   dwMask.l
   dwBCastAddr.l
   dwReasmSize.l
   unused1.w
   wType.w
EndStructure

Structure MIB_IPADDRTABLE
   dwNumEntries.l
   *ipAddrTable.MIB_IPADDRROW
EndStructure

Procedure GetIPtable()

dwResult.i
dwRetVal.i
TableSize.i = 0
*TableBroadcastAddr.MIB_IPADDRTABLE = AllocateMemory(SizeOf(MIB_IPADDRTABLE))

dwResult = GetIpAddrTable_(*TableBroadcastAddr, @TableSize, #True)

If dwResult = #ERROR_INSUFFICIENT_BUFFER
  *pIPAddrTable = ReAllocateMemory(*TableBroadcastAddr, TableSize)
  dwRetVal = GetIpAddrTable_(*TableBroadcastAddr, @TableSize, #True)
  If dwRetVal = #NO_ERROR
    *ipinfo.MIB_IPADDRROW = @*TableBroadcastAddr\ipAddrTable
    For loop = 0 To *TableBroadcastAddr\dwNumEntries - 1
      interfaceindex.i = *ipinfo\dwIndex
      If interfaceindex > 0
      AddElement(IP_table())
     
      IP_table()\nIPAddr=*ipinfo\dwAddr
      IP_table()\nMask = *ipinfo\dwMask
       
        IP_table()\IP$ = IPString(IP_table()\nIPAddr , #PB_Network_IPv4)
        IP_table()\Mask$=IPString(IP_table()\nMask , #PB_Network_IPv4)
       
        IP_table()\nNetListenAddr=IP_table()\nIPAddr & IP_table()\nMask
        IP_table()\NetListenAddr$ = IPString(IP_table()\nNetListenAddr , #PB_Network_IPv4)

        IP_table()\nBrodCastAddr=(IP_table()\nMask!$ffffffff)|IP_table()\nIPAddr
        IP_table()\BrodCastAddr$=IPString(IP_table()\nBrodCastAddr , #PB_Network_IPv4)
       
      EndIf
      *ipinfo = *ipinfo + SizeOf(MIB_IPADDRROW)
    Next
  EndIf
EndIf

EndProcedure

0

3

Почему после этой записи

Код:
*pIPAddrTable = ReAllocateMemory(*TableBroadcastAddr, TableSize)

далее по коду все еще используется *TableBroadcastAddr? Если память будет освобождена при изменении ее размера, то этот указатель станет нерабочим.

Код должен быть таким.

Код:
#MIB_IPADDR_PRIMARY = $0001
#MIB_IPADDR_DYNAMIC = $0004
#MIB_IPADDR_DISCONNECTED = $0008
#MIB_IPADDR_DELETED = $0040
#MIB_IPADDR_TRANSIENT = $0080

Structure MIB_IPADDRROW
   dwAddr.l
   dwIndex.l
   dwMask.l
   dwBCastAddr.l
   dwReasmSize.l
   unused1.w
   wType.w
EndStructure

Structure MIB_IPADDRTABLE
   dwNumEntries.l
   *ipAddrTable.MIB_IPADDRROW
EndStructure

Procedure GetIPtable()
  
  dwResult.i
  dwRetVal.i
  TableSize.i = 0
  *TableBroadcastAddr.MIB_IPADDRTABLE = AllocateMemory(SizeOf(MIB_IPADDRTABLE))
  
  If *TableBroadcastAddr
    
    dwResult = GetIpAddrTable_(*TableBroadcastAddr, @TableSize, #True)
    
    If dwResult = #ERROR_INSUFFICIENT_BUFFER
      *pIPAddrTable = ReAllocateMemory(*TableBroadcastAddr, TableSize)
      If *pIPAddrTable
        *TableBroadcastAddr=*pIPAddrTable
        
        dwRetVal = GetIpAddrTable_(*TableBroadcastAddr, @TableSize, #True)
        If dwRetVal = #NO_ERROR
          *ipinfo.MIB_IPADDRROW = @*TableBroadcastAddr\ipAddrTable
          For loop = 0 To *TableBroadcastAddr\dwNumEntries - 1
            interfaceindex.i = *ipinfo\dwIndex
            If interfaceindex > 0
              AddElement(IP_table())
              
              IP_table()\nIPAddr=*ipinfo\dwAddr
              IP_table()\nMask = *ipinfo\dwMask
              
              IP_table()\IP$ = IPString(IP_table()\nIPAddr , #PB_Network_IPv4)
              IP_table()\Mask$=IPString(IP_table()\nMask , #PB_Network_IPv4)
              
              IP_table()\nNetListenAddr=IP_table()\nIPAddr & IP_table()\nMask
              IP_table()\NetListenAddr$ = IPString(IP_table()\nNetListenAddr , #PB_Network_IPv4)
              
              IP_table()\nBrodCastAddr=(IP_table()\nMask!$ffffffff)|IP_table()\nIPAddr
              IP_table()\BrodCastAddr$=IPString(IP_table()\nBrodCastAddr , #PB_Network_IPv4)
              
            EndIf
            *ipinfo = *ipinfo + SizeOf(MIB_IPADDRROW)
          Next
        EndIf
        
      EndIf
    EndIf
    
    FreeMemory(*TableBroadcastAddr)
    
  EndIf
  
EndProcedure

0

4

Спасибо.
Изначальный код - не мой. Пытаясь понять его - заподозрил некоторую некорректность.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Как получить маску сети?