|
Вопрос # 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 (статус: Посетитель)
Вопрос отправлен: 30 мая 2010, 11:51
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 8; последнее сообщение — 30 мая 2010, 15:33; участников в обсуждении: 4.
|
min@y™ (статус: Доктор наук), 30 мая 2010, 11:58 [#1]:
Ну и в чём проблема? Не знаешь, как пропарсить файл?
Конкретизируй задачу, Разложи её по пунктам:
1. Загрузить файл.
2...
3...
...
N.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
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 (статус: 3-ий класс), 30 мая 2010, 14:20 [#3]:
а что за такое модное форматирование?
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
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™ (статус: Доктор наук), 30 мая 2010, 14:25 [#5]:
Цитата (Shouldercannon):
Не знаю правильно ли я начал, и что делать дальше.
Всё равно не понимаю, что тебе нужно сделать. Объясни подробнее.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
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™ (статус: Доктор наук), 30 мая 2010, 15:30 [#7]:
Цитата (Shouldercannon):
Всёбы хорошо, но значения фиксированные, а требуется их загружать из файла.
Загрузи значения в TStringList, преобразуй сразу в список из DWORD-значений. Потом сравнивай.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 30 мая 2010, 15:33 [#8]:
Хотя, имхо, лучше и проще разработать свой класс, который бы занимался загрузкой, преобразованием и хранением списка и имел бы метод проверки вхождения данного IP-адреса в список. Было бы компактно, красиво и прозрачно. Можно также предусмотреть пополнение списка новыми адресами и сохранения списка в файл.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|