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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.07.2012, 18:33   #1
denis76560
Форумчанин
 
Регистрация: 13.01.2010
Сообщений: 121
По умолчанию Получение разрядов IP адреса.

Приветствую Вас, пишу прогу для проверки проксиков, возникла необходимость удалить все внутресетевые адреса (зарезервированные системой под сеть) то есть:
все адреса диапазонов:
Код:
{
10.0.0.0 — 10.255.255.255 (10.0.0.0/8 или 10/8),
172.16.0.0 — 172.31.255.255 (172.16.0.0/12 или 172.16/12),
192.168.0.0 — 192.168.255.255 (192.168.0.0/16 или 192.168/16).
127.0.0.0 — 127.255.255.255.
}
Написал функцию для обработки каждой строки из компонента МЕМО, в котором список проксиков с портами для подключения.
Возникла проблема с получением каждого разряда IP адреса.
Например, нужно от другой функции получить первый разряд из аипишника
127.0.0.1 - она должна выдать 127, или например
второй разряд из IP 172.24.255.255 должна вернуть 24.
Getdischarge(ip:string;discharge:integer):integer;
Getdischarge('172.24.255.255',4) - должна вернуть 255.
Подскажите пожалуйста, как это можно сделать, или может у кого где валяется готовое решение. Просто я уже голову сломал, запутался в цикле FOR получать значение первой и второй и т.д. точек. Нифига не получается. Заранее спасибо всем за внимание к посту и огромное спасибо всем ответившим.

Последний раз редактировалось denis76560; 27.07.2012 в 18:37.
denis76560 вне форума Ответить с цитированием
Старый 27.07.2012, 18:46   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

denis76560

inet_addr - из строки c IP получаешь число
далее обычными сдвигами и маской выделяешь нужный октет
Rififi вне форума Ответить с цитированием
Старый 27.07.2012, 19:00   #3
denis76560
Форумчанин
 
Регистрация: 13.01.2010
Сообщений: 121
По умолчанию

Спасибо, но боюсь что мне это не поможет=(
memo4.Lines.Add(inttostr( inet_addr(PAnsiChar(AnsiString('127 .55.66.77')))));
возвращает
1296185215
Это походу дела IP адрес в десятичном виде. А мне нужно сверять каждый рязряд каждого IP адреса с маской фильтра. И если он подходит под правило внутрисетевых адресов - удалять его из списка.
denis76560 вне форума Ответить с цитированием
Старый 27.07.2012, 19:07   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Pos, PosEx для нахождения точки в строке, Delete для удаления подстроки из строки
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.07.2012, 19:08   #5
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

denis76560

1296185215
Это походу дела IP адрес в десятичном виде. А мне нужно сверять каждый рязряд каждого IP адреса с маской фильтра. И если он подходит под правило


первую строчку моего сообщения ты прочитал и понял правильно. Это уже хорошо :D

Теперь со второй.

Имеем адрес 127 .55.66.77 и его числовое представление 1296185215 = 0x 4D 42 37 7F

переведи каждый из 4х байтов в десятичную форму. сравни с разрядами в строке. подивись. (((Ж
Rififi вне форума Ответить с цитированием
Старый 28.07.2012, 14:26   #6
Rock-n-Rolla
Форумчанин
 
Регистрация: 11.01.2012
Сообщений: 177
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
inet_addr - из строки c IP получаешь число
далее обычными сдвигами и маской выделяешь нужный октет
ну нужны никакие сдвиги. Уже всё сделано за нас
Код:
typedef struct in_addr {
  union {
    struct {
      u_char s_b1,s_b2,s_b3,s_b4;
    } S_un_b;
    struct {
      u_short s_w1,s_w2;
    } S_un_w;
    u_long S_addr;
  } S_un;
} IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;
S_un_b.s_b1, S_un_b.s_b2, S_un_b.s_b3 и S_un_b.s_b4 - всё уже есть
progromore.i2p - первый русскоязычный портал программистов в скрытосети
Rock-n-Rolla вне форума Ответить с цитированием
Старый 30.07.2012, 21:25   #7
denis76560
Форумчанин
 
Регистрация: 13.01.2010
Сообщений: 121
По умолчанию

Всем спасибо большое, решено
denis76560 вне форума Ответить с цитированием
Старый 01.08.2012, 13:45   #8
denis76560
Форумчанин
 
Регистрация: 13.01.2010
Сообщений: 121
По умолчанию

Всем ответившим ОГРОМНОЕ спасибо (особенно АВАТАР за напоминание о POSEX). Много оказывается разных вариантов решений, просто позабыл давно про POSEX, из-за нее и затупил - просто запутался...

мало-ли нужно кому-то будет - вот фунция:
Код:
function getint(ip:string;disch:integer):integer;
Var
s1,s2,s3,s4:string;
i1,i2,i3:integer;
len1,len2,len3:integer;
begin
i1:=posex('.',ip,disch);
i2:=posex('.',ip,i1+1);
i3:=posex('.',ip,i2+1);
len2:=i2-i1;
len2:=i2-i1-1;
len3:=length(ip)-i3;
if disch=1 then result:= Strtoint(copy(ip,0,i1-1));
if disch=2 then result:= Strtoint(copy(ip,i1+1,len2));
if disch=3 then result:= Strtoint(copy(ip,i2+1,len3));
if disch=4 then result:= Strtoint(copy(ip,i3+1,length(ip)));
end;

Последний раз редактировалось denis76560; 01.08.2012 в 13:51.
denis76560 вне форума Ответить с цитированием
Старый 02.08.2012, 19:00   #9
Rock-n-Rolla
Форумчанин
 
Регистрация: 11.01.2012
Сообщений: 177
По умолчанию

denis76560, всё можно было сделать в 10 раз проще
Код:
function getint(ip:string;disch:integer):integer;
var
  ipd:integer;
begin
  Result:=0;
  ipd:=inet_addr(pchar(ip));
  if ipd=INADDR_NONE then exit;
  if disch=1 then result:= ord(in_addr(ipd).S_un_b.s_b1);
  if disch=2 then result:= ord(in_addr(ipd).S_un_b.s_b2);
  if disch=3 then result:= ord(in_addr(ipd).S_un_b.s_b3);
  if disch=4 then result:= ord(in_addr(ipd).S_un_b.s_b4);
end;
progromore.i2p - первый русскоязычный портал программистов в скрытосети
Rock-n-Rolla вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разбор map-файла и получение реального адреса функций GreenWizard Общие вопросы Delphi 3 14.06.2012 19:57
Получение адреса ячейки Sergey112233 Microsoft Office Excel 2 04.08.2011 17:08
получение ip адреса the_deer_one Общие вопросы .NET 4 07.07.2011 14:12
Получение IP адреса Letnab Работа с сетью в Delphi 4 07.03.2011 15:12