Показать сообщение отдельно
  #48  
Старый 12.04.2022, 21:27
Аватар для Neil
Neil Neil вне форума
Генерал-Полковник
 
Регистрация: 26.01.2008
Сообщений: 7,374
Спасибо: 2,905
Neil стоит на развилке
Лампочка

Цитата:
Сообщение от BigO Посмотреть сообщение
...
Вот это все бы в явном виде. Мол, вот адреса такие, вот эти для этого, а эти и использовать можно...
в этом и была задумка - показать новичку / интересующемуся как всё происходит,
НО выше меня подтолкнули к минимализму
добавлю и примеры побитовых операций, НО! мне кажется это может только запутать

Цитата:
Сообщение от BigO Посмотреть сообщение
... Когда у тебя просто показывается первый адрес сети и пустота в остальных местах - страшно. А подсети с 0 хостов имеют вообще смысл? Имею в виду: есть ли смысл давать выбирать такие конфигурации тогда? Может лучше тоже ошибку показывать?...
а в SOHO маршрутизаторах со стандартным 192.168.1.1 можно выбрать подсеть 255.255.255.254?
я бы попробовал. НО мне завтра ещё работать в моём 841n есть рандом по маске.
НО не хочется перенастраивать... в итоге для этого есть и такой функционал в моём приложении

сети с 0 хостов имеют смысл. их можно посчитать

Цитата:
Сообщение от BigO Посмотреть сообщение
... Не надо стесняться своего кода, если оно компилируется, запускается и выполняет свою работу - это уже лучше, чем многие пишут в продакшн за деньги.
Благодарю. я не из-за стеснения. у меня руки не доходят
можно проще

...
using System;
using System.Net;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Netuter
{
public partial class Glavnoe_Okno : Form
{
struct Net
{
public byte[] ip;
public byte[] maska;
public byte[] wildcard;
public byte biti_v_maske;
public ulong hosti;
public byte[] set;
public byte[] minip;
public byte[] broadcast;
public byte[] maxip;
}
public Glavnoe_Okno()
{
InitializeComponent();
Pole_Vvoda_IP.SelectedItem = "192.168.0.1";
Pole_Vvoda_Maski.SelectedItem = "255.255.255.0";
Pole_KolVo_Podsetei.SelectedItem = "4";
}
private void Glavnoe_Okno_Load(object sender, EventArgs e)
{}
private void Poschitat_Click(object sender, EventArgs e)
{
Pole_Vivoda_Bit_V_Maske.Clear();
Pole_Vivoda_Seti.Clear();
Pole_Vivoda_Broadcast.Clear();
Pole_Vivoda_Wildcard.Clear();
Pole_Vivoda_MinIP.Clear();
Pole_Vivoda_MaxIP.Clear();
Pole_Vivoda_Hostov.Clear();

Net set;

try
{
set = Obiect_set(Pole_Vvoda_IP.Text, Pole_Vvoda_Maski.Text.Substring(Pole_Vvoda_Maski.Text.IndexOf('-') + 2));
}
catch (Exception)
{
return;
}

if (Proverka_Maski_I_IP(set) == false)
{
return;
}

Pole_Vivoda_Bit_V_Maske.Text = set.biti_v_maske.ToString();
Pole_Vivoda_Seti.Text = $"{set.set[0]}.{set.set[1]}.{set.set[2]}.{set.set[3]}";
Pole_Vivoda_Broadcast.Text = $"{set.broadcast[0]}.{set.broadcast[1]}.{set.broadcast[2]}.{set.broadcast[3]}";
Pole_Vivoda_Wildcard.Text = $"{set.wildcard[0]}.{set.wildcard[1]}.{set.wildcard[2]}.{set.wildcard[3]}";
Pole_Vivoda_MinIP.Text = $"{set.minip[0]}.{set.minip[1]}.{set.minip[2]}.{set.minip[3]}";
Pole_Vivoda_MaxIP.Text = $"{set.maxip[0]}.{set.maxip[1]}.{set.maxip[2]}.{set.maxip[3]}";

if (set.maxip[0] == set.set[0])
{
if (set.maxip[1] == set.set[1])
{
if (set.maxip[2] == set.set[2])
{
if (set.maxip[3] == set.set[3])
{
Pole_Vivoda_MaxIP.Text = "--//--//--";
}
}
}
}

if (set.biti_v_maske == 32)
{
Pole_Vivoda_Broadcast.Text = "--//--//--";
Pole_Vivoda_MinIP.Text = "--//--//--";
Pole_Vivoda_MaxIP.Text = "--//--//--";
}

Pole_Vivoda_Hostov.Text = set.hosti.ToString(); Pole_Vivoda_Hostov.Enabled = true;

uint kolvo_setei = uint.Parse(Pole_KolVo_Podsetei.Text);

ulong shag = (set.hosti + 2) / (kolvo_setei);

if (2 > shag)
{
Ne_Hvataet_Hostov malo_hostov = new Ne_Hvataet_Hostov();

malo_hostov.ShowDialog();

return;
}

for (int i = 0; i < Kvadratnii_Koren(kolvo_setei); i++)
{
set.maska = Pribavliaem_Bit_K_Maske(set.maska);
}

set = Obiect_set(set.minip, set.maska);

list_Vivod_Podsetei.Items.Clear();

for (int i = 0; i < kolvo_setei; i++)
{
ListViewItem lv = new ListViewItem(new string[] {
$"{set.minip[0]}.{set.minip[1]}.{set.minip[2]}.{set.minip[3]}",
$"{set.maxip[0]}.{set.maxip[1]}.{set.maxip[2]}.{set.maxip[3]}",
$"{set.maska[0]}.{set.maska[1]}.{set.maska[2]}.{set.maska[3]}",
$"{set.set[0]}.{set.set[1]}.{set.set[2]}.{set.set[3]}",
set.hosti.ToString() });

if (set.maxip[0] == set.set[0])
{
if (set.maxip[1] == set.set[1])
{
if (set.maxip[2] == set.set[2])
{
if (set.maxip[3] == set.set[3])
{
lv = new ListViewItem(new string[] {
$"{set.minip[0]}.{set.minip[1]}.{set.minip[2]}.{set.minip[3]}",
"--//--//--",
$"{set.maska[0]}.{set.maska[1]}.{set.maska[2]}.{set.maska[3]}",
$"{set.set[0]}.{set.set[1]}.{set.set[2]}.{set.set[3]}",
set.hosti.ToString() });
}
}
}
}

list_Vivod_Podsetei.Items.Add(lv);

set = Obiect_set(Pribavliaem_Biti_K_IP(set.ip, shag), set.maska);
}
}
static byte[] Ocifrovka_IP(string stroka_s_ip)
{
Regex shablon_dlia_proverki_vvedennogo_ip = new Regex(@"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}?$");

byte[] massiv_ip;

if (shablon_dlia_proverki_vvedennogo_ip.IsMatch(stroka_s_ip))
{
IPAddress ip_adres;

IPAddress.TryParse(stroka_s_ip, out ip_adres);

if (ip_adres != null)
{
massiv_ip = IPAddress.Parse(stroka_s_ip).GetAddressBytes();
}
else
{
Ne_Pravilnii_IP plohoi_ip = new Ne_Pravilnii_IP();

plohoi_ip.ShowDialog();

return null;
}
}
else
{
Ne_Pravilnii_IP plohoi_ip = new Ne_Pravilnii_IP();

plohoi_ip.ShowDialog();

return null;
}

return massiv_ip;
}
static byte[] Wildcard(byte[] maska)
{
byte[] wildcard = { 0, 0, 0, 0 };

wildcard[0] = (byte)(~maska[0]);
wildcard[1] = (byte)(~maska[1]);
wildcard[2] = (byte)(~maska[2]);
wildcard[3] = (byte)(~maska[3]);

return wildcard;
}
static byte Biti_V_Maske(byte[] maska)
{
byte biti_v_maske = 0;

for (int i = 0; i < 4; i++)
{
switch (maska[i])
{
case 255: biti_v_maske += 8; break;
case 254: biti_v_maske += 7; break;
case 252: biti_v_maske += 6; break;
case 248: biti_v_maske += 5; break;
case 240: biti_v_maske += 4; break;
case 224: biti_v_maske += 3; break;
case 192: biti_v_maske += 2; break;
case 128: biti_v_maske += 1; break;
default: break;
}
}

return biti_v_maske;
}
static ulong Hosti(byte biti_v_maske)
{
ulong hosti = 1;

if (biti_v_maske == 32)
{
return hosti = 0;
}

for (int i = 0; i < 32 - biti_v_maske; i++)
{
hosti <<= 1;
}

hosti -= 2;

return hosti;
}
static byte[] Set(byte[] ip, byte[] maska)
{
byte[] set = { 0, 0, 0, 0 };

set[0] = (byte)(ip[0] & maska[0]);
set[1] = (byte)(ip[1] & maska[1]);
set[2] = (byte)(ip[2] & maska[2]);
set[3] = (byte)(ip[3] & maska[3]);

return set;
}
static byte[] MinIP(byte[] set)
{
byte[] minip = { 0, 0, 0, 0 };

minip[0] = set[0];
minip[1] = set[1];
minip[2] = set[2];
minip[3] = set[3];

minip[3]++;

return minip;
}
static byte[] Broadcast(byte[] set, byte[] wildcard)
{
byte[] broadcast = { 0, 0, 0, 0 };

broadcast[0] = (byte)(set[0] + wildcard[0]);
broadcast[1] = (byte)(set[1] + wildcard[1]);
broadcast[2] = (byte)(set[2] + wildcard[2]);
broadcast[3] = (byte)(set[3] + wildcard[3]);

return broadcast;
}
static byte[] MaxIP(byte[] broadcast)
{
byte[] maxip = { 0, 0, 0, 0 };

maxip[0] = broadcast[0];
maxip[1] = broadcast[1];
maxip[2] = broadcast[2];
maxip[3] = broadcast[3];

maxip[3]--;

return maxip;
}
static Net Obiect_set(string ip, string maska)
{
Net set;

set.ip = Ocifrovka_IP(ip);
set.maska = Ocifrovka_IP(maska);
set.wildcard = Wildcard(set.maska);
set.biti_v_maske = Biti_V_Maske(set.maska);
set.hosti = Hosti(set.biti_v_maske);
set.set = Set(set.ip, set.maska);
set.minip = MinIP(set.set);
set.broadcast = Broadcast(set.set, set.wildcard);
set.maxip = MaxIP(set.broadcast);

return set;
}
static Net Obiect_set(byte[] ip, byte[] maska)
{
Net set;

set.ip = ip;
set.maska = maska;
set.wildcard = Wildcard(set.maska);
set.biti_v_maske = Biti_V_Maske(set.maska);
set.hosti = Hosti(set.biti_v_maske);
set.set = Set(set.ip, set.maska);
set.minip = MinIP(set.set);
set.broadcast = Broadcast(set.set, set.wildcard);
set.maxip = MaxIP(set.broadcast);

return set;
}
static bool Proverka_Maski_I_IP(Net set)
{
if (set.ip[0] == 192)
{
if (set.biti_v_maske < 16)
{
Ne_Pravilnaia_Maska plohaia_maska = new Ne_Pravilnaia_Maska();

plohaia_maska.ShowDialog();

return false;
}
}

if (set.ip[0] == 172)
{
if (set.biti_v_maske < 12)
{
Ne_Pravilnaia_Maska plohaia_maska = new Ne_Pravilnaia_Maska();

plohaia_maska.ShowDialog();

return false;
}
}

if (set.ip[0] == 10)
{
if (set.biti_v_maske < 8)
{
Ne_Pravilnaia_Maska plohaia_maska = new Ne_Pravilnaia_Maska();

plohaia_maska.ShowDialog();

return false;
}
}

return true;
}
static byte[] Pribavliaem_Bit_K_Maske(byte[] maska)
{
byte[] novaia_maska = { 0, 0, 0, 0 };

novaia_maska[0] = maska[0];
novaia_maska[1] = maska[1];
novaia_maska[2] = maska[2];
novaia_maska[3] = maska[3];

for (int i = 0; i < 4; i++)
{
switch (novaia_maska[i])
{
case 0: novaia_maska[i] = 128; return novaia_maska;
case 128: novaia_maska[i] = 192; return novaia_maska;
case 192: novaia_maska[i] = 224; return novaia_maska;
case 224: novaia_maska[i] = 240; return novaia_maska;
case 240: novaia_maska[i] = 248; return novaia_maska;
case 248: novaia_maska[i] = 252; return novaia_maska;
case 252: novaia_maska[i] = 254; return novaia_maska;
case 254: novaia_maska[i] = 255; return novaia_maska;
default: break;
}
}

return novaia_maska;
}
static byte[] Pribavliaem_Biti_K_IP(byte[] ip, ulong kolichestvo_bit)
{
byte[] novii_ip = { 0, 0, 0, 0 };

novii_ip[0] = ip[0];
novii_ip[1] = ip[1];
novii_ip[2] = ip[2];
novii_ip[3] = ip[3];

for (ulong i = 0; i < kolichestvo_bit; i++)
{
if (novii_ip[3] == 255)
{
if (novii_ip[2] == 255)
{
if (novii_ip[1] == 255)
{
novii_ip[3] = 0;
novii_ip[2] = 0;
novii_ip[1] = 0;
novii_ip[0]++;
}
else
{
novii_ip[3] = 0;
novii_ip[2] = 0;
novii_ip[1]++;
}
}
else
{
novii_ip[3] = 0;
novii_ip[2]++;
}
}
else
{
novii_ip[3]++;
}
}

return novii_ip;
}
static uint Kvadratnii_Koren(uint kolvo_setei)
{
uint count = 0;

while (true)
{
if (kolvo_setei == 1 || kolvo_setei == 0)
{
return count;
}

kolvo_setei = kolvo_setei / 2;

count++;
}
}
}
}
__________________
"любой вопрос имеет право на жизнь, любой человек может ошибаться или не знать каких-то простых вещей" © serr (lubuntu.ru)

Мальчик сказал маме: “Я хочу кушать”. Мама отправила его к папе.
Мальчик сказал папе: “Я хочу кушать”. Папа отправил его к маме.
Мальчик сказал маме: “Я хочу кушать”. Мама отправила его к папе.
И бегал так мальчик, пока в один момент не упал.
Что случилось с мальчиком? TTL кончился.


три слова - это два слова! © banda agency Киев
Ответить с цитированием