Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Есть ли в Delphi функция проверки IP-адреса на валидность? [D7, XP]


Страницы:   1 2 3

SergP ©   (2011-10-04 16:56:00) 

Есть ли в Delphi функция проверки IP-адреса на валидность?

Я , конечно могу сам написать свою, но интересует именно наличие готовой.


Rouse_   (2011-10-04 19:13:00) [21]


> Омлет ©   (04.10.11 19:07) [29]
> WinAPI не кроссплатформенно ))

Ну тогда правь ошибки :) Например оть тут будет вылет при пустой строке:
pCurChar := @s[1];
:)


Dennis I. Komarov   (2011-10-04 19:11:00) [22]

uses
comctrls, commctrl;
type
TIPEdit = class(TWinControl)
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure WMGetDlgCode( var Message:TWMGetDlgCode); message WM_GETDLGCODE;
end;
procedure TIPEdit.CreateParams(var Params: TCreateParams);
begin
InitCommonControl(ICC_INTERNET_CLASSES );
inherited CreateParams(Params);
CreateSubClass(Params, WC_IPADDRESS);
Params.Style := Params.Style or WS_TABSTOP;
end;
procedure TIpEdit.WMGetDlgCode;
begin
inherited;
Message.Result := Message.result or DLGC_WANTARROWS; // and not DLGC_WANTTAB;
end;
var Edit1: TIPEdit;
procedure TForm1.FormCreate(Sender: TObject);
begin
if not Assigned(Edit1) then begin
Edit1 := TIPEdit.Create(Self);
with Edit1 do
begin
Name := 'Edit1';
Parent := Self;
Left := 24;
Top := 16;
Width := 121;
Height := 21;
Tabstop := True;
end;
SendMessage(Edit1.Handle,IPM_CLEARADDRESS,0,0);
SendMessage(Edit1.Handle,IPM_SETADDRESS,0,MAKEIPADDRESS(127,0,0,1));
end;
end;


Не помню чей (to Rouse_ вроде твой, но могу ошибаться), но кого-то из мастеров. Если интересно, можно на .net поискать, так что на авторство не претендую :)


Омлет   (2011-10-04 19:07:00) [23]

> Rouse_ ©

WinAPI не кроссплатформенно ))

> Омлет ©   (04.10.11 18:55) [26]

Поправка
[+] контроль количества цифр, чтобы "0127.0.0.1" не прошел.

function StrToIP(const s: string; out IP: Longword): boolean;
var
 pCurChar: ^byte;
 prevChar: byte;
 i, dotCount, digitCount: integer;
 x: longword;
begin
 Result := false;
 IP := 0;
 x := 0;
 dotCount := 0;
 pCurChar := @s[1];
 digitCount := 0;
 prevChar := ord('.');
 for i := length(s)-1 downto 0 do
 begin
   if (pCurChar^ >= ord('0')) and (pCurChar^ <= ord('9')) then
   begin
     if digitCount = 3 then exit;
     inc(digitCount);
     x := x*10 + pCurChar^ - ord('0');
     if x > 255 then exit;
     if i = 0 then
     begin
       IP := IP shl 8 + x;
       Result := (dotCount = 3);
       exit;
     end;
   end
   else if pCurChar^ = ord('.') then
   begin
     if (dotCount = 3) or (prevChar = pCurChar^) then exit;
     inc(dotCount);
     IP := IP shl 8 + x;
     x := 0;
     digitCount := 0;
   end
   else exit;
   prevChar := pCurChar^;
   inc(pCurChar);
 end;
end;


Rouse_   (2011-10-04 18:58:00) [24]

зы: которая так-же учитывает следующие представления IP адреса:

Internet address value Meaning
"4.3.2.16"             Decimal
"004.003.002.020"      Octal
"0x4.0x3.0x2.0x10"     Hexadecimal
"4.003.002.0x10"       Mix


Rouse_   (2011-10-04 18:56:00) [25]


> Омлет ©   (04.10.11 18:55) [26]

Дык это все делается вызовом одной единственной АПИ :)
Rouse_ ©   (04.10.11 17:58) [22]


Омлет   (2011-10-04 18:55:00) [26]

Проверка на валидность + конвертация:

function StrToIP(const s: string; out IP: Longword): boolean;
var
 pCurChar: ^byte;
 prevChar: byte;
 i, dotCount: integer;
 x: longword;
begin
 Result := false;
 IP := 0;
 x := 0;
 dotCount := 0;
 pCurChar := @s[1];
 prevChar := ord('.');
 for i := length(s)-1 downto 0 do
 begin
   if (pCurChar^ >= ord('0')) and (pCurChar^ <= ord('9')) then
   begin
     x := x*10 + pCurChar^ - ord('0');
     if x > 255 then exit;
     if i = 0 then
     begin
       IP := IP shl 8 + x;
       Result := (dotCount = 3);
       exit;
     end;
   end
   else if pCurChar^ = ord('.') then
   begin
     if (dotCount = 3) or (prevChar = pCurChar^) then exit;
     inc(dotCount);
     IP := IP shl 8 + x;
     x := 0;
   end
   else exit;
   prevChar := pCurChar^;
   inc(pCurChar);
 end;
end;


DVM   (2011-10-04 18:23:00) [27]


>
> SergP ©   (04.10.11 16:56) 
> Есть ли в Delphi функция проверки IP-адреса на валидность?
>

TIdIPAddress


SergP   (2011-10-04 18:05:00) [28]


> Anatoly Podgoretsky ©   (04.10.11 17:51) [18]
>
> Лишь бы похоже было, а все остальное не важно.


Все остальное проверится потом.
Главное чтобы не вводили откровенной фигни...


Rouse_   (2011-10-04 18:03:00) [29]

А код в общем случае для получения InAddr примерно такой (данные представлены в виде IP адреса или UNC имени):

   InAddr := inet_addr(PChar(Addr));
   if InAddr = INADDR_NONE then
   begin
     Host := gethostbyname(PChar(Addr));
     if not Assigned(Host) then
     begin
//        OutputDebugString(PChar(Addr + ' gethostbyname failed'));
       Exit;
     end;
//      OutputDebugString(PChar('gethostbyname = ' + Addr));
     InAddr := PInAddr(Host.h_addr_list^)^.S_addr;
   end;


Rouse_   (2011-10-04 17:58:00) [30]

http://msdn.microsoft.com/en-us/library/ms738563%28VS.85%29.aspx


Dennis I. Komarov   (2011-10-04 17:56:00) [31]

дома валяется код, кажися Розыча, вроде даже не компонент, а виндовый...

если не выложат, то попозже...


pavel_guzhanov   (2011-10-04 17:52:00) [32]

Используй MaskEdit, он решит большую часть твоих проблем.


Jeer   (2011-10-04 17:51:00) [33]

Где-то даже валялся компонент IP-Edit :)


Anatoly Podgoretsky   (2011-10-04 17:51:00) [34]

Лишь бы похоже было, а все остальное не важно.


SergP   (2011-10-04 17:48:00) [35]


> Dennis I. Komarov ©   (04.10.11 17:43) [16]
>
> А ИП откуда берешь?


Пользователь вводит... Вот и нужно проверить, чтобы он не вел какую-то хрень.


Dennis I. Komarov   (2011-10-04 17:43:00) [36]

А ИП откуда берешь?


Медвежонок Пятачок   (2011-10-04 17:42:00) [37]

Ну для порта проверок и не нужно

для адреса тоже самое, только dword.


SergP   (2011-10-04 17:40:00) [38]


> Кроме IP есть ещё порт. Их тоже все проверять будешь на
> валидность?


Ну для порта проверок и не нужно, достаточно чтобы он был числом и умещался в word


Jeer   (2011-10-04 17:39:00) [39]


> SergP ©   (04.10.11 16:56)  

За это вреся можно написать с десяток подобных функций и не захламлять форум :)

> SergP ©   (04.10.11 17:36) [12]


SergP   (2011-10-04 17:36:00) [40]


> Jeer ©   (04.10.11 17:31) [9]
>
> Опять проблемы с парсингом строки. :(


Нет. Я же в [0] писал, что:


> Я , конечно могу сам написать свою, но интересует именно
> наличие готовой.


Просто когда есть что-то готовое, то нет смысла захламлять код своими вариантами таких функций.
Поэтому и пытаюсь узнать есть ли что-то готовое.
Если нет - напишу сам...


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо