Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2015, 09:02   #1
Ти6ка
Пользователь
 
Регистрация: 22.04.2015
Сообщений: 24
Сообщение IP-калькулятор

По введенному 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;
}

Последний раз редактировалось Stilet; 02.12.2015 в 15:47.
Ти6ка вне форума Ответить с цитированием
Старый 02.12.2015, 15:13   #2
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

И что не так?

Последний раз редактировалось taras-proger; 02.12.2015 в 15:15.
taras-proger вне форума Ответить с цитированием
Старый 02.12.2015, 15:48   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
for (int i = 0; mask[i] != '\0'; i++)
Применить функции работы со строками (например sscanf()) желания не возникает?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
калькулятор SholpanB ASP.NET 1 11.11.2013 08:26
калькулятор!!!! maratos Помощь студентам 9 22.04.2011 06:48
калькулятор в С++ natashasuper5 Помощь студентам 3 10.04.2011 23:02
калькулятор на с++ -=Andriushka=- Помощь студентам 3 04.03.2011 21:21
Калькулятор Иринка26 Помощь студентам 11 19.02.2010 17:05