[fpc-pascal] lNet getting the local IP

Brian Winfrey bwcode4u at gmail.com
Fri Oct 8 00:41:26 CEST 2010


I think you want to use 127.0.0.1 to return the actual address.

In my case I would

const
  CN_GDNS_ADDR = '127.0.0.1';

run the progarm and the output would be 192.168.1.5 as long as there
is an active interface.

On Thu, Oct 7, 2010 at 3:34 PM, silvioprog <silvioprog at gmail.com> wrote:
> Hi Brian,
> I tested again, and discovered that's not is necessary a connection to a
> web.
> I changed to 0.0.0.0 and returned 127.0.0.1, perfect! :)
> I will use this function. Thanks very much again. :)
> 2010/10/7 Brian Winfrey <bwcode4u at gmail.com>
>>
>> >> On 06/10/10 14:27, Felipe Monteiro de Carvalho wrote:
>> >>> Ok, thanks everyone, it seams that I managed to extract a function
>> >>> from Silvio's code which doesn't use Synapse. I only tested in Windows
>> >>> so far:
>> >>>
>> >>> unit chesstcputils;
>> >>>
>> >>> {$mode objfpc}{$H+}
>> >>>
>> >>> interface
>> >>>
>> >>> uses
>> >>>    {$IFDEF MSWINDOWS}
>> >>>    Winsock,
>> >>>    {$ENDIF}
>> >>>    Classes, SysUtils;
>> >>>
>> >>> function ChessGetLocalIP(): string;
>> >>>
>> >>> implementation
>> >>>
>> >>> const
>> >>>    CFormatIPMask = '%d.%d.%d.%d';
>> >>>
>> >>> function ChessGetLocalIP(): string;
>> >>> var
>> >>>    I, VAttempt: Integer;
>> >>>    VStrTemp, VSitesToTry: TStringList;
>> >>> {$IFDEF UNIX}
>> >>>    VProcess: TProcess;
>> >>> {$ENDIF}
>> >>> {$IFDEF MSWINDOWS}
>> >>> var
>> >>>    VWSAData: TWSAData;
>> >>>    VHostEnt: PHostEnt;
>> >>>    VName: string;
>> >>> {$ENDIF}
>> >>> begin
>> >>>    Result := '';
>> >>> {$IFDEF UNIX}
>> >>>        VStrTemp := TStringList.Create;
>> >>>        VProcess := TProcess.Create(nil);
>> >>>        try
>> >>>          VProcess.CommandLine :=
>> >>>            'sh -c "ifconfig eth0 | awk ''/inet end/ {print $3}''"';
>> >>
>> >> Yuck.  This doesn't work on my system (debian).  If you really want the
>> >> least effort, you may have more luck with simply parsing `hostname -I`
>> >> somehow.  The right way to do this is with an ioctl, I believe
>> >> (SIOCGIFCONF).  Look here:
>> >>
>> >> http://www.kernel.org/doc/man-pages/online/pages/man7/netdevice.7.html
>> >>
>> >> I'm sure there's some code floating around, but it probably means that
>> >> you have to translate some headers :(.
>> >>
>> >> Henry
>> >>
>> > Re: [fpc-pascal] lNet getting the local IP
>> >>
>> >
>> > I found an example for linux on stack overflow that was in c
>> >
>> > http://stackoverflow.com/questions/212528/linux-c-get-the-ip-address-of-local-computer
>> >
>> > - here is a rough translation:
>> >
>> > program GetPrimaryIpAddress;
>> > {$mode objfpc}
>> >
>> > uses
>> >  baseunix,
>> >  unixtype,
>> >  sockets,
>> >  SysUtils;
>> >
>> > procedure Get(var buf: array of char; const len: longint);
>> > const
>> >  CN_GDNS_ADDR = '8.8.8.8';
>> >  CN_GDNS_PORT = 53;
>> > var
>> >  s: string;
>> >  sock: longint;
>> >  err: longint;
>> >  HostAddr: TSockAddr;
>> >  l: Integer;
>> >  UnixAddr: TInetSockAddr;
>> >
>> > begin
>> >  err := 0;
>> >  Assert(len >= 16);
>> >
>> >  sock := fpsocket(AF_INET, SOCK_DGRAM, 0);
>> >  assert(sock <> -1);
>> >
>> >  UnixAddr.family := AF_INET;
>> >  UnixAddr.port := htons(CN_GDNS_PORT);
>> >  UnixAddr.addr := StrToHostAddr(CN_GDNS_ADDR).s_addr;
>> >
>> >  if (fpConnect(sock, at UnixAddr,SizeOf(UnixAddr)) = 0) then
>> >  begin
>> >    try
>> >      l := SizeOf(HostAddr);
>> >      if (fpgetsockname(sock, @HostAddr, @l) = 0) then
>> >      begin
>> >        s := NetAddrToStr(HostAddr.sin_addr);
>> >        StrPCopy(PChar(Buf), s);
>> >      end
>> >      else
>> >      begin
>> >        err:=socketError;
>> >      end;
>> >    finally
>> >      if (fpclose(sock) <> 0) then
>> >      begin
>> >        err := socketError;
>> >      end;
>> >    end;
>> >  end
>> >  else
>> >  begin
>> >    err:=socketError;
>> >  end;
>> >
>> >  if (err <> 0) then
>> >  begin
>> >    // report error
>> >  end;
>> > end;
>> >
>> > var
>> >  ipbuf: array[0..255] of char;
>> >
>> > begin
>> >  system.FillChar(ipbuf, sizeOf(ipBuf), #0);
>> >  Get(ipbuf, system.SizeOf(ipbuf));
>> >  WriteLn(StrPas(ipbuf));
>> > end.
>> >
>> > BrianW
>> >
>> I have tried this code with multiple scenarios.
>>
>> if interfaces are down, no ip address is returned. I would say that is
>> expected as there is no network.
>> ifconfig will return same. only lo has an address 127.0.0.1.
>>
>> Otherwise I get the primary ip address as long as routing is used.
>>
>> if connecting to 0.0.0.0, 127.0.0.1 is returned
>>
>> Use 127.0.0.1 and the primary is returned.
>>
>> Run some tests and let me know what you find.
>
> --
> Silvio Clécio,
> programmer ObjectPascal
>
>
> _______________________________________________
> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-pascal
>



More information about the fpc-pascal mailing list