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