Что нового

Как определить вхождение Ip в диапазон

ramslader

Новичок
Сообщения
6
Репутация
0
Подскажите пожалуйста как написать функцию для проверки вхождения Ip адреса в диапазон.
Известны адрес сети, маска и ip соответственно.
Допустим 192.168.0.0 255.255.255.240 входит ли ip 192.168.0.144.
Спасибо за внимание.
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
ramslader [?]
Допустим 192.168.0.0 255.255.255.240 входит ли ip 192.168.0.144.
Код:
$sNetIP = "192.168.0.144"
$sNetwork = "192.168.0.0"
$sNetMask = "255.255.255.240"

If _IsIPRange($sNetIP, $sNetwork, $sNetMask) Then
	ConsoleWrite(StringFormat("Адрес принадлежит сети!\n"))
Else
	ConsoleWrite(StringFormat("Адрес НЕ принадлежит сети!\n"))
EndIf

Func _IsIPRange($s_NetIP, $s_Network, $s_Mask)

	$i_NetIP = _IP2Long($s_NetIP)
	$i_Network = _IP2Long($s_Network)
	$i_CIDR = _IP2Long(_Mask2CIDR($s_Mask))
   If ($i_NetIP >= $i_Network) And ($i_NetIP <=  ((2^(32 - $i_CIDR)-1) + $i_Network)) Then
      Return 1
   Else
      Return 0
	 EndIf

EndFunc ;==>_IsIPRange

Func _IP2Long($s_IPAddress)

	$i_IPLong = ''

	$a_IPAddress = StringSplit($s_IPAddress, ".")
	For $i = $a_IPAddress[0] To 1 Step -1
		Assign($i, $a_IPAddress[$i], 1)
		$i_IPLong += Eval($i) * 256^($a_IPAddress[0] - $i)
	Next

	Return $i_IPLong
EndFunc ;==>_IP2Long

Func _Mask2CIDR($s_Mask)

	$s_Bin = ''
	$s_Mask = _IP2Long($s_Mask)
	_Dec2Bin($s_Mask, $s_Bin)
	$i_Pref = Stringinstr($s_Bin, "0")
	If Not $i_Pref Then $i_Pref = 32

   Return $i_Pref
EndFunc ;==>_Mask2CIDR

Func _Dec2Bin($i_Dec, ByRef $s_Bin)

	If Not $s_Bin Then $s_Bin = ''
	If( $i_Dec > 2) Then
		_Dec2Bin($i_Dec / 2, $s_Bin)
		$s_Bin &= Floor(Mod($i_Dec, 2))
	EndIf

EndFunc ;==>_Dec2Bin
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
Garrett,
А зачем Assign() и Eval()?
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
madmasles [?]
А зачем Assign() и Eval()?
Пока писал функцию, экспериментировал, да так и оставил. :smile:
Код:
Func _IP2Long($s_IPAddress)

	$i_IPLong = ''

	$a_IPAddress = StringSplit($s_IPAddress, ".")
	For $i = $a_IPAddress[0] To 1 Step -1
		$i_IPLong += $a_IPAddress[$i] * 256^($a_IPAddress[0] - $i)
	Next

	Return $i_IPLong
EndFunc ;==>_IP2Long
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
Garrett,
Почитал здесь про сети, и, если я правильно понял то, что прочитал, у Вас ошибка: вместо
Код:
;~ ...
If ($i_NetIP >= $i_Network) And ($i_NetIP <= ((2 ^ (32 - $i_CIDR) - 1) + $i_Network)) Then
;~ ...
Должно быть
Код:
;~ ...
If ($i_NetIP >= $i_Network) And ($i_NetIP <= ((2 ^ (32 - $i_CIDR) - 2) + $i_Network)) Then
;~ ...
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
madmasles [?]
если я правильно понял
Вы всё правильно поняли, но ведь ramslader хотел проверить, входит ли IP в диапазон выделенных адресов. Поэтому, я намеренно оставил широковещательный адрес (бродкаст).


Добавлено:
Сообщение автоматически объединено:

То, что широковещательный адрес не используется, ещё не говорить о том, что этого делать нельзя. :whistle:
Однако, если понадобится, исправить недолго. :smile:
 

timit

Новичок
Сообщения
4
Репутация
0
Добрый день! я совсем недавно начал изучать сей язык и передомной встала задача определить к какому диапазону принадлежит ip

на основе Вашего кода напильником допили свой но почему то срабатывает либо первый case либо второй до третьего и исключения не доходит почему то хотя по логике должно срабатывать исключение если я ввожу не тот ip
Прошу подсказать что я делаю не правильно?


Код:
$s ="10.72.15.14"
$a ="255.255.255.0"
;Сети
$n ="192.168.72.0"
$t ="10.72.14.0"
$r ="10.72.15.0"


Local $sNetIP = $s, $sNetwork = $n, $sNetMask = $a


Switch _IsIPRange($sNetIP, $sNetwork, $sNetMask)
 Case $sNetwork = "192.168.72.0"
   ConsoleWrite(StringFormat("Адрес принадлежит сети 192.168.72.0!\n"))
 Case $sNetwork = "10.72.14.0"
   ConsoleWrite(StringFormat("Адрес принадлежит сети 10.72.14.0!\n"))
 Case $sNetwork = "10.72.15.0"
   ConsoleWrite(StringFormat("Адрес принадлежит сети 10.72.15.0!\n"))
 Case Else
    ConsoleWrite(StringFormat("Адрес НЕ принадлежит сети!\n"))
EndSwitch

Func _IsIPRange($s_NetIP, $s_Network, $s_Mask)

    $i_NetIP = _IP2Long($s_NetIP)
    $i_Network = _IP2Long($s_Network)
    $i_CIDR = _IP2Long(_Mask2CIDR($s_Mask))
   If ($i_NetIP >= $i_Network) And ($i_NetIP <=  ((2^(32 - $i_CIDR)-1) + $i_Network)) Then
      Return 1
   Else
      Return 0
     EndIf

EndFunc ;==>_IsIPRange

Func _IP2Long($s_IPAddress)

    $i_IPLong = ''

    $a_IPAddress = StringSplit($s_IPAddress, ".")
    For $i = $a_IPAddress[0] To 1 Step -1
        Assign($i, $a_IPAddress[$i], 1)
        $i_IPLong += Eval($i) * 256^($a_IPAddress[0] - $i)
    Next

    Return $i_IPLong
EndFunc ;==>_IP2Long

Func _Mask2CIDR($s_Mask)

    $s_Bin = ''
    $s_Mask = _IP2Long($s_Mask)
    _Dec2Bin($s_Mask, $s_Bin)
    $i_Pref = Stringinstr($s_Bin, "0")
    If Not $i_Pref Then $i_Pref = 32

   Return $i_Pref
EndFunc ;==>_Mask2CIDR

Func _Dec2Bin($i_Dec, ByRef $s_Bin)

    If Not $s_Bin Then $s_Bin = ''
    If( $i_Dec > 2) Then
        _Dec2Bin($i_Dec / 2, $s_Bin)
        $s_Bin &= Floor(Mod($i_Dec, 2))
    EndIf

EndFunc ;==>_Dec2Bin
 

Alecsis

Знающий
Сообщения
37
Репутация
19
Привет! Что-то такое подойдёт? Разве что «защиту от дурака» подпилить надо…
 

Вложения

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 610
Репутация
2 438
почему то срабатывает либо первый case
Потому что неверное использование Switch, там проверяется результат работы функции _IsIPRange, а не условие, скорее всего нужно так:

Код:
$s = "10.72.15.14"
$a = "255.255.255.0"
;Сети
$n = "192.168.72.0"
$t = "10.72.14.0"
$r = "10.72.15.0"

Local $sNetIP = $s, $sNetMask = $a
Local $aNetworks[] = [$n, $t, $r]
Local $fFound = False

For $i = 0 To UBound($aNetworks) - 1
    If _IsIPRange($sNetIP, $aNetworks[$i], $sNetMask) Then
        ConsoleWrite(StringFormat("Адрес принадлежит сети %s!\n", $aNetworks[$i]))
        $fFound = True
    EndIf
Next

If Not $fFound Then
    ConsoleWrite(StringFormat("Адрес НЕ принадлежит сети!\n"))
EndIf

...
 
Верх