September 21, 2023

Работа с  калькулятором сетей 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;

Ответ: 5.