Работа с калькулятором сетей TCP/IP в PascalАВС.NЕТ
В библиотеке School начиная с версии PascalАВС.NЕТ 3.9.0.3360 от 21.09.23 доступен калькулятор сетей TCP/IP, реализованный на базе двух классов: собственно калькулятора CalcIP и класса 32-битных адресов Addr32, обеспечивающего работу калькулятора, а также предоставляющего удобную работу с адресами IPv4 при самостоятельном использовании.
Класс Addr32
В классе доступны на чтение три свойства (приведен пример для 192.168.0.1):
value: string- адрес в десятичном представлении с октетами,192.168.0.1;value2: string- дополненное (при необходимости) слева нулями до длины 32 бита двоичное представление адреса,11000000101010000000000000000001;value10: longword- беззнаковое целое значение адреса,3232235521.
Метод AddrFormat(addr: string): string форматирует параметр addr, разделяя точкой каждые 8 бит: 11000000.10101000.00000000.00000001.
Перегруженный метод .ToString: string служит для простого и наглядного вывода значений адресов созданного объекта:
## uses School;
var a := new Addr32('192.168.0.1');
Print(a)
{
192.168.0.1, 11000000.10101000.00000000.00000001
} В классе перегружены три логические побитовые операции: and; or, not. Они могут быть полезны для операций с маской. Применяются в коде программы, естественно, к самим объектам, а не к их свойствам. Например, наложим на сетевой адрес 135.12.171.214 маску 255.255.248 и получим адрес сети:
## uses School;
var ip := new Addr32('135.12.171.214');
var mask := new Addr32('255.255.248.0');
var net_addr := ip and mask;
Print(net_addr)
{
135.12.168.0, 10000111.00001100.10101000.00000000
}Перегрузка операции сложения (+) позволяет складывать с адресом целое число n: lobgword, тем самым получая новый адрес, отстоящий от имеющегося на n. Такая операция полезна при переборе адресов.
## uses School;
var ip := new Addr32('135.12.171.214');
for var i := 0 to 5 do
Println(ip + i)
{
135.12.171.214,10000111.00001100.10101011.11010110
135.12.171.215,10000111.00001100.10101011.11010111
135.12.171.216,10000111.00001100.10101011.11011000
135.12.171.217,10000111.00001100.10101011.11011001
135.12.171.218,10000111.00001100.10101011.11011010
135.12.171.219,10000111.00001100.10101011.11011011
}Класс содержит два конструктора. Аргумент первого из них - адрес в десятичной записи с октетами. В приведенных примерах вызывался именно этот конструктор. Второй конструктор используется для построения маски сети по префиксу - количеству единичных бит в левой части маски. Например, для сетевого адреса a.b.c.d/19 маску можно создать вызовом Addr32(19).
## uses School;
var mask := new Addr32(19);
Print(mask)
{
255.255.224.0, 11111111.11111111.11100000.00000000
}Класс CalcIP
В классе доступны на чтение девять свойств. Их имена и назначение видны, если объект класса CalcIP отправить на вывод.
Address: Addr32- IP-адрес;Netmask: Addr32- маска сетевого адреса;Bitmask: byte- количество единиц в маске адреса сети;Hosts: integer- количество хостов в сети (исключая адрес сети и широковещательный адрес)Wildcard: Addr32- маска хостов (инверсияBitmask);Network: Addr32- адрес сети;Broadcast: Addr32- широковещательный адрес;Hostmin: Addr32- адрес первого хоста;Hostmax: Addr32- адрес последнего хоста.
Перегруженный метод .ToString: string служит для вывода всех свойств объекта в отформатированном виде:
Класс содержит два конструктора. Первый требует задать в виде десятичных адресов с октетами ip-адрес и маску сети. Пример вызова такого конструктора приведен на рисунке выше. Этот же калькулятор можно было создать, задав в качестве второго параметра префикс маски подсети, т.е. /28:
var calc := new CalcIP('202.75.38.176', 28);Генератор адресов GenAddrBin: sequence of string позволяет создавать последовательность двоичных адресов хостов, включая адрес сети и широковещательный адрес. Формат адреса - Addr32.value2.
Еще один генератор адресов GenAddr: sequence of Addr32 может быть использован для более сложной работы с адресными объектами.
Пример. Решение задачи с сайта К. Полякова
(№ 6844) (К. Багдасарян) В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая - к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 202.75.38.176 и маской сети 255.255.255.240. Сколько в этой сети IP-адресов, у которых в двоичной записи IP-адреса никакие три единицы или три нуля не стоят рядом? В ответе укажите только число.
## uses School;
var calc6844 := new CalcIP('202.75.38.176', '255.255.255.240');
calc6844.GenAddrBin.Count(addr -> not addr.IsMatch('000|111')).Println;