Test for valid ip address

classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

Test for valid ip address

Koenraad Lelong-4
Hi,

I need a way to test if an string containing an ipv4-address is really
an ipv4-address.
I tried
tmpAddress:=HostAddrToStr(StrToHostAddr(IPAddressStr));
writeln(tmpAddress);
  if (tmpAddress='0.0.0.0') then
   begin
    writeln('Error in IP-address');
    IPAddressStr:=tmpAddress;
   end;
When I enter 192.168.185.297 (i.e. not a valid ipv4 address) in
IPAddressStr I get
192.168.185.41
not the expected error-message.

According to the rtl-manual :

function StrToHostAddr(IP: AnsiString) : in_addr
Description: StrToHostAddr converts the string representation in IP to a
host address and returns the host
address.
Errors: On error, the host address is filled with zeroes.

I would think that converting those zeroes to a host-address would yield
0.0.0.0.

Am I missing something ?
Is there a better way, without using some other network-library ?

Koenraad.
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: Test for valid ip address

Jonas Maebe-2
On 28/07/16 10:14, Koenraad Lelong wrote:

> I need a way to test if an string containing an ipv4-address is really
> an ipv4-address.
> I tried
> tmpAddress:=HostAddrToStr(StrToHostAddr(IPAddressStr));
> writeln(tmpAddress);
>  if (tmpAddress='0.0.0.0') then
>   begin
>    writeln('Error in IP-address');
>    IPAddressStr:=tmpAddress;
>   end;
> When I enter 192.168.185.297 (i.e. not a valid ipv4 address) in
> IPAddressStr I get
> 192.168.185.41
> not the expected error-message.

You can add a multiple of 256 to any octet of an IPv4 address in most
programs. Try it in your browser, it will probably also work.


Jonas
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: Test for valid ip address

Rainer Stratmann
In reply to this post by Koenraad Lelong-4
The IP-Adress is a dword, but you can change, that it fits for you.


function str_getval( str : shortstring ) : longint;
var cod : longint;
begin
 val( str , result , cod );
end;

function ip_from_string( ipstr : shortstring ; out error : boolean ) : dword;
var
 c : char;
 ipn , pointanz : longint;
 x : longint;
 pstr : shortstring;
 ip : dword;


 procedure add_ip;
 begin
  ipn := str_getval( pstr );
  if ( ipn > 255 ) or ( pstr = '' ) then error := true;
  ip := ip shl 8;
  ip := ip or ipn;
  pstr := '';
 end;

begin
 ip := 0;
 pstr := '';
 error := false;
 pointanz := 0;
 for x := 1 to length( ipstr ) do begin
  c := ipstr[ x ];
  case c of
   '0'..'9' : pstr := pstr + c;
   '.' : begin
    inc( pointanz );
    add_ip;
   end;
   else error := true;
  end;
 end;
 add_ip;
 if pointanz <> 3 then error := true;
 if error then result := 0
          else result := ip;
end;



Am Donnerstag, 28. Juli 2016, 10:14:10 schrieb Koenraad Lelong:

> Hi,
>
> I need a way to test if an string containing an ipv4-address is really
> an ipv4-address.
> I tried
> tmpAddress:=HostAddrToStr(StrToHostAddr(IPAddressStr));
> writeln(tmpAddress);
>   if (tmpAddress='0.0.0.0') then
>    begin
>     writeln('Error in IP-address');
>     IPAddressStr:=tmpAddress;
>    end;
> When I enter 192.168.185.297 (i.e. not a valid ipv4 address) in
> IPAddressStr I get
> 192.168.185.41
> not the expected error-message.
>
> According to the rtl-manual :
>
> function StrToHostAddr(IP: AnsiString) : in_addr
> Description: StrToHostAddr converts the string representation in IP to a
> host address and returns the host
> address.
> Errors: On error, the host address is filled with zeroes.
>
> I would think that converting those zeroes to a host-address would yield
> 0.0.0.0.
>
> Am I missing something ?
> Is there a better way, without using some other network-library ?
>
> Koenraad.
> _______________________________________________
> fpc-pascal maillist  -  [hidden email]
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: Test for valid ip address

Mattias Gaertner
In reply to this post by Jonas Maebe-2
On Thu, 28 Jul 2016 10:26:32 +0200
Jonas Maebe <[hidden email]> wrote:

> On 28/07/16 10:14, Koenraad Lelong wrote:
> > I need a way to test if an string containing an ipv4-address is really
> > an ipv4-address.
> > I tried
> > tmpAddress:=HostAddrToStr(StrToHostAddr(IPAddressStr));
> > writeln(tmpAddress);
> >  if (tmpAddress='0.0.0.0') then
> >   begin
> >    writeln('Error in IP-address');
> >    IPAddressStr:=tmpAddress;
> >   end;
> > When I enter 192.168.185.297 (i.e. not a valid ipv4 address) in
> > IPAddressStr I get
> > 192.168.185.41
> > not the expected error-message.  
>
> You can add a multiple of 256 to any octet of an IPv4 address in most
> programs. Try it in your browser, it will probably also work.

What browser supports that?

Mattias
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: Test for valid ip address

Christo Crause
In reply to this post by Koenraad Lelong-4
On Thu, 2016-07-28 at 10:14 +0200, Koenraad Lelong wrote:

> When I enter 192.168.185.297 (i.e. not a valid ipv4 address) in
> IPAddressStr I get
> 192.168.185.41
> not the expected error-message.
>
> According to the rtl-manual :
>
> function StrToHostAddr(IP: AnsiString) : in_addr
> Description: StrToHostAddr converts the string representation in IP to a
> host address and returns the host
> address.
> Errors: On error, the host address is filled with zeroes.
>
> I would think that converting those zeroes to a host-address would yield
> 0.0.0.0.
>
> Am I missing something ?
> Is there a better way, without using some other network-library ?

The in_addr IP address type is a packed record of byte, so if an IP
address part larger than 255 is encountered in a string it will be
truncated when copied to the byte record using StrToHostAddr.  This
probably means you have to use some other means of detecting an invalid
address, or add a check for (tmpAddress <> IPAddressStr) to cater for
your situation.

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: Test for valid ip address

Rainer Stratmann
In reply to this post by Jonas Maebe-2
Am Donnerstag, 28. Juli 2016, 10:26:32 schrieb Jonas Maebe:

> On 28/07/16 10:14, Koenraad Lelong wrote:
> > I need a way to test if an string containing an ipv4-address is really
> > an ipv4-address.
> > I tried
> > tmpAddress:=HostAddrToStr(StrToHostAddr(IPAddressStr));
> > writeln(tmpAddress);
> >
> >  if (tmpAddress='0.0.0.0') then
> >  
> >   begin
> >  
> >    writeln('Error in IP-address');
> >    IPAddressStr:=tmpAddress;
> >  
> >   end;
> >
> > When I enter 192.168.185.297 (i.e. not a valid ipv4 address) in
> > IPAddressStr I get
> > 192.168.185.41
> > not the expected error-message.
>
> You can add a multiple of 256 to any octet of an IPv4 address in most
> programs. Try it in your browser, it will probably also work.

In Firefox 45.2.0 on Linux it does not work.
It is confusing anyway.
 
>
> Jonas
> _______________________________________________
> fpc-pascal maillist  -  [hidden email]
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: Test for valid ip address

Koenraad Lelong-4
In reply to this post by Christo Crause
Op 28-07-16 om 10:38 schreef Christo:

> The in_addr IP address type is a packed record of byte, so if an IP
> address part larger than 255 is encountered in a string it will be
> truncated when copied to the byte record using StrToHostAddr.  This
> probably means you have to use some other means of detecting an invalid
> address, or add a check for (tmpAddress <> IPAddressStr) to cater for
> your situation.

Thanks,

I used the check :
(tmpAddress <> IPAddressStr)
in stead of
(tmpAddress='0.0.0.0')

Koenraad

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal