По введенному IP-адресу и маске нужно определить Network ID и Host ID.
Помогите написать эти функции.
Функции для проверки корректности IP и маски написал:
Код:
#include "stdafx.h"
#include <iostream>
#include <locale>
#include <cstring>
bool CheckAddress(char* ip_)
{
int points = 0, // количествоточек
numbers = 0; // значение октета
char* buff = new char[3]; // буффер для одного октета
for (int i = 0; ip_[i] != '\0'; i++)
{
if (ip_[i] <= '9' && ip_[i] >= '0')
{
if (numbers > 3) return false;
buff[numbers++] = ip_[i];
}
else if (ip_[i] == '.') // если точка
{
if (atoi(buff) > 255) return false;
// проверитьдиапазоноктета
if (numbers == 0) return false;
//если числа нет - ошибка
numbers = 0;
points++;
}
else return false;
}
if (points != 3) return false;
// если количство точек в IP-адресе не 3 - ошибка
return true;
}
bool CheckMask(char* mask)
{
int points = 0, // количествоточек
numbers = 0; // значение октета
char* str = "";
int prevok=255;
int mask_for_mask[8] = { 255, 254, 252, 248, 240, 224, 192, 128 };
char* buff = new char[3];
for (int i = 0; mask[i] != '\0'; i++)
{
if (mask[i] <= '9' && mask[i] >= '0')
{
if (numbers > 3) return false;
buff[numbers++] = mask[i];
}
else if (mask[i] == '.') // если точка
{
if (atoi(buff) > 255) return false; // проверить диапазон октета
if ((atoi(buff) != 255) && (atoi(buff) != 254) && (atoi(buff) != 252) && (atoi(buff) != 248)
&& (atoi(buff) != 240) && (atoi(buff) != 224) && (atoi(buff) != 192) && (atoi(buff) != 128) && (atoi(buff) != 0))
{
return false;
}
if (((atoi(buff) == 255) || (atoi(buff) == 254) || (atoi(buff) == 252) || (atoi(buff) == 248)
|| (atoi(buff) == 240) || (atoi(buff) == 224) || (atoi(buff) == 192) || (atoi(buff) == 128)) && (prevok != 255))
{
if (prevok != 0) return false;
}
if (atoi(buff) > prevok) return false;
if (numbers == 0) return false;
//если числа нет - ошибка
prevok = atoi(buff);
numbers = 0;
points++;
for (int i = 0; i < sizeof(buff); i++) buff[i] = -1;
}
else return false;
};
if (points != 3) return false;
// если количство точек в маске не 3 - ошибка
if (atoi(buff) == 0) return true;
if ((atoi(buff) != 255) && (atoi(buff) != 254) && (atoi(buff) != 252) && (atoi(buff) != 248) && (atoi(buff) != 240)
&& (atoi(buff) != 224) && (atoi(buff) != 192) && (atoi(buff) != 128) && (atoi(buff) != 0))
{
return false;
};
if (((atoi(buff) == 255) || (atoi(buff) == 254) || (atoi(buff) == 252) || (atoi(buff) == 248) || (atoi(buff) == 240)
|| (atoi(buff) == 224) || (atoi(buff) == 192) || (atoi(buff) == 128) || (atoi(buff) == 0)) && (prevok != 255))
{
return false;
}
return true;
}
unsigned long CharToULong(char* ip_)
{
unsigned long out = 0; //число для IP-адреса
char *buff = new char[3];
//буфер для хранения одного октета
for (int i = 0, j = 0; ip_[i] != '\0'; i++, j++)
{
if (ip_[i] != '.') //если не точка
buff[j] = ip_[i]; // записать символ в буфер
if (ip_[i] == '.' || ip_[i+1] == '\0')
{
// если следующий октет или последний
out<<= 8; //сдвинуть число на 8 бит
if (atoi(buff) > 255) return NULL;
// ели октет больше 255 - ошибка
out += (unsigned long)atoi(buff);
//преобразовать и добавить к числу IP-адреса
j = -1;
};
}
return out;
}
char net_host_id(char* pip, char* pmask)
{
int points = 0, // количествоточек
numbers = 0; // значение октета
char buff_one_ok[3]; // буффер для одного октета
char ip[32] = "";
char* mask = new char[32];
int buff;
char ip2[32];
strcpy(ip2, "");
char buff_ip2[32];
for (int i = 0; pip[i] != '\0'; i++)
// для строки IP-адреса
{
if (pip[i] <= '9' && pip[i] >= '0') // если цифра
{
if (numbers > 3) return false;
//если больше трех чисел в октете - ошибка
buff_one_ok[numbers++] = pip[i];
//скопировать в буффер
}
else if (pip[i] == '.') // если точка
{
if (atoi(buff_one_ok) > 255) return false;
// проверитьдиапазоноктета
if (numbers == 0) return false;
//если числа нет - ошибка
buff = atoi(buff_one_ok);
_itoa(buff, buff_ip2, 2);
strcat(ip2, buff_ip2);
numbers = 0;
points++;
}
else return false;
}
return true;
};
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "Rus");
char* ip = "192.168.255.132";
char* mask = "255.0.0.0";
if (CheckAddress(ip))
{
std::cout << "IP-адрес правильный" << std::endl;
}
else std::cout << "IP-адрес не правильный" << std::endl;
if (CheckMask(mask))
{
std::cout << "Маска правильная" << std::endl;
}
else std::cout << "Маска не правильная" << std::endl;
net_host_id(ip, mask);
//CharToULong(ip);
system("pause");
return 0;
}