Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 245

/ вопрос открыт /

Здравствуйте!
Помогите пожалуйста реализовать следующее. Задача заключается в том, чтобы загрузить из файла диапазоны IP и сравнить их с IP присоединяющегося. Файл *.cfg с таким содержимым:
3
127.0.0.0
127.0.0.255
128.0.0.0
128.0.0.255
129.0.0.0
129.0.0.255

При чтении командой ReadLn, в первой строке глубина цикла, от 1 до этого значения. Затем, в цикле подряд два оператора чтения ReadLn, первый сохраняет в запись ячейки "От", второй в запись "По". Сам массив от 1 до значения, что считано с первой строки файла.

Shouldercannon Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Shouldercannon (статус: Посетитель)
Вопрос отправлен: 30 мая 2010, 11:51
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 30 мая 2010, 15:33; участников в обсуждении: 4.
min@y™

min@y™ (статус: Доктор наук), 30 мая 2010, 11:58 [#1]:

Ну и в чём проблема? Не знаешь, как пропарсить файл?
Конкретизируй задачу, Разложи её по пунктам:
1. Загрузить файл.
2...
3...
...
N.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Shouldercannon

Shouldercannon (статус: Посетитель), 30 мая 2010, 13:59 [#2]:

...
var
  Data: TStringList;
  Range, s: Integer;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
Data := TStringList.Create;
  Data.Duplicates := dupIgnore;
end;
 
procedure TForm1.BLoadClick(Sender: TObject);
begin
Data.LoadFromFile('IPRanges.cfg'); //Загружаю
  Memo1.Text := Data.Text; //Вывожу (для себя)
 
//Тут опрделяю сколько нужно считывать "C" - "По"
Range := StrToInt(Copy(Data.Text, 1, 1));
  s := 0;
    while  s < Range do
      begin
        s := s + 1;
      end;
end;
Не знаю правильно ли я начал, и что делать дальше.
bugmenot

bugmenot (статус: 3-ий класс), 30 мая 2010, 14:20 [#3]:

а что за такое модное форматирование?
виконання програми розпочинається з того самого мiсця, де призупинилося.

IlluminatI

IlluminatI (статус: 2-ой класс), 30 мая 2010, 14:23 [#4]:

Да все намного проще.
var
 N, i: integer; // "глубина цикла", параметр
 s: string; // строка
begin 
 AssignFile(Input,'Путь к cfg файлу');
 Readln(Input, N);
 for i := 1 to N do 
  begin
   Readln(Input, S);
   // проверка на совпадение IP адресов
   if S = <IP подключающегося> then
    begin
     // что-то делаем
    end;
  end;
 CloseFile(Input); // поработали - закроем
 // ...
end;

Писал тут, возможны небольшие ошибки
min@y™

min@y™ (статус: Доктор наук), 30 мая 2010, 14:25 [#5]:

Цитата (Shouldercannon):

Не знаю правильно ли я начал, и что делать дальше.

Всё равно не понимаю, что тебе нужно сделать. Объясни подробнее.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Shouldercannon

Shouldercannon (статус: Посетитель), 30 мая 2010, 15:13 [#6]:

Вот весь расклад. Я с помощью данного кода проверяю IP на совпадение
...
function IPtoDWORD(const s: string):DWORD;
var
L: TStringList;
b: packed array [0..3] of byte;
i: Integer;
begin
Result := 0;
  L := TStringList.Create;
    try
      L.Delimiter := '.';
        L.DelimitedText := s;
          for i := 0 to 3 do
            b[3 - i] := StrToInt(L[i]);
              Result := pdword(@b[0])^;
    finally
      L.Free
    end;
end;
...
if (NewIP >= IPtoDWORD('192.168.0.0')) and (NewIP <= IPtoDWORD('192.168.0.255')) then
  //Пускаем
    else
      ServerSocket.Socket.Connections[i - 1].SendText('запрет'); //Запрет
        ServerSocket.Socket.Connections[i - 1].Close; //Закрываем канал
          if (NewIP >= IPtoDWORD('193.168.0.0')) and (NewIP <= IPtoDWORD('193.168.0.255')) then
            //Пускаем
            if (NewIP >= IPtoDWORD('194.168.0.0')) and (NewIP <= IPtoDWORD('194.168.0.255')) then
              //Пускаем
                if (NewIP >= IPtoDWORD('195.168.0.0')) and (NewIP <= IPtoDWORD('195.168.0.255')) then
                  //Пускаем
...
Всёбы хорошо, но значения фиксированные, а требуется их загружать из файла.
min@y™

min@y™ (статус: Доктор наук), 30 мая 2010, 15:30 [#7]:

Цитата (Shouldercannon):

Всёбы хорошо, но значения фиксированные, а требуется их загружать из файла.

Загрузи значения в TStringList, преобразуй сразу в список из DWORD-значений. Потом сравнивай.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 30 мая 2010, 15:33 [#8]:

Хотя, имхо, лучше и проще разработать свой класс, который бы занимался загрузкой, преобразованием и хранением списка и имел бы метод проверки вхождения данного IP-адреса в список. Было бы компактно, красиво и прозрачно. Можно также предусмотреть пополнение списка новыми адресами и сохранения списка в файл.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:42
Выполнено за 0.04 сек.