![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Есть ли в Delphi функция проверки IP-адреса на валидность? [D7, XP]
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] писал, что:
> Я , конечно могу сам написать свою, но интересует именно
> наличие готовой.
Просто когда есть что-то готовое, то нет смысла захламлять код своими вариантами таких функций.
Поэтому и пытаюсь узнать есть ли что-то готовое.
Если нет - напишу сам...