Lazarus

Programming => Operating Systems => Windows CE => Topic started by: jpremor on February 03, 2010, 05:44:14 pm

Title: Looking for all network resources
Post by: jpremor on February 03, 2010, 05:44:14 pm
Hi all!!

i'm new on forum but using lazarus with wince and inet for some days!!

i searching how to find all IP on the device. Looking for some code on the net i found this (sorry about the portuguese variables and coments) which uses Winsock:

Code: [Select]
       if WSAStartup($0101, GInitData) <> 0 then FormPrinc.Label11.Caption := 'Nenhum add'
        else begin

GetHostName(TempBuf, SizeOf(TempBuf));
           FormPrinc.Label11.Caption := TempBuf + ' : ';
        // busca ip
         phe :=GetHostByName(TempBuf);
        if phe = nil then begin

       end
         else begin
         i := 0;
       pptr := PaPInAddr(Phe^.h_addr_list);
while pptr^[i] <> nil do begin
        FormPrinc.Label11.Caption := FormPrinc.Label11.Caption + StrPas(inet_ntoa(pptr^[i]^));
        Inc(i);
end;
WSACleanup;
         end;

end; // se conseguiu pegar winsock


thats ok, but it seems to result just on the first network adapter found. Normally smartphones have more than one (Active sync, wireless, 3G)...

anyone knows if there is possible to list all adapters and look for all ips? If there is no such functions ready to do this i'll be pleased to help to develop this. The problem is: I dont know where to start...

i found some code to search for device list for lazarus and delphi, but on wince there is some functions missing.

Code: [Select]
type
 PNetResourceArray = ^TNetResourceArray;
 TNetResourceArray = array[0..100] of TNetResource;

function CreateNetResourceList(ResourceType: DWord;
                             NetResource: PNetResource;
                             out Entries: DWord;
                             out List: PNetResourceArray): Boolean;
var
 EnumHandle: THandle;
 BufSize: DWord;
 Res: DWord;
begin
 Result := False;
 List := Nil;
 Entries := 0;
 if WNetOpenEnum(RESOURCE_GLOBALNET,
                 ResourceType,
                 0,
                 NetResource,
                 EnumHandle) = NO_ERROR then begin
   try
     BufSize := $4000;  // 16 kByte
     GetMem(List, BufSize);
     try
       repeat
         Entries := DWord(-1);
         FillChar(List^, BufSize, 0);
         Res := WNetEnumResource(EnumHandle, Entries, List, BufSize);
         if Res = ERROR_MORE_DATA then
         begin
           ReAllocMem(List, BufSize);
         end;
       until Res <> ERROR_MORE_DATA;
       Result := Res = NO_ERROR;
       if not Result then
       begin
         FreeMem(List);
         List := Nil;
         Entries := 0;
       end;
     except
       FreeMem(List);
       raise;
     end;
   finally
     WNetCloseEnum(EnumHandle);
   end;
 end;
end;

In this case WNetEnumResource (dont know the origin) should do the work of WSAStartup (winsock).

Any ideia??

thanks!

Title: Re: Looking for all network resources
Post by: Marc on February 04, 2010, 12:21:30 pm
I used to use the method similar to your last one, till I found out that is fails on some windows versions. Then I swithed to the following (WSAstartup/Cleanup is done once globally, so not here)
Code: Pascal  [Select]
  1. var
  2.   HostName: array[byte] of Char;
  3.   res, work: PAddrInfo;
  4. begin
  5.   if gethostname(Hostname, Length(Hostname)) <> 0
  6.   then begin
  7.     // some error
  8.     Exit;
  9.   end;
  10.  
  11.   if getaddrinfo(Hostname, nil, nil, res) <> 0
  12.   then begin
  13.     // some error
  14.     Exit;
  15.   end;
  16.  
  17.   work := res;
  18.   while work <> nil do
  19.   begin
  20.     DoSomethingWith(PSockAddrIn(work^.ai_addr)^.sin_Addr.S_addr)..
  21.  
  22.     work := work^.ai_next;
  23.   end;
  24.  
  25.   freeaddrinfo(res);
  26. end;
  27.  
Title: Re: Looking for all network resources
Post by: jpremor on February 04, 2010, 01:45:30 pm
Hi marc,

Yesterday i read some information on microsoft site about winsock functions and noticed that this functions are Obsolete, as you said. I'll do this change today, but expecting the same result.

Thanks!
Title: Re: Looking for all network resources
Post by: Marc on February 04, 2010, 05:43:05 pm
Which functions were obsolete ?
Title: Re: Looking for all network resources
Post by: jpremor on February 11, 2010, 06:27:33 pm

Marc,

sorry i made some confusion here. The obsolete function that i saw does not have anything to do with winsock. Sorry.

Here is the function which works...



Code: [Select]

uses
  winsock


// **********************************
// find local ip
procedure TFormPrinc.BtnUpdateIPClick(Sender: TObject);
type
TaPInAddr = array [0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
TempStr : string;
TempBuf : array [0..63] of char;
    phe: PHostEnt;
    pptr: PaPInAddr;
    i : integer;
    IPstr : string;
    GInitData: TWSADATA;
begin

    FormPrinc.LabelIpLocal.Caption := '';

    TempStr := '';
    if WSAStartup($0101, GInitData) <> 0 then FormPrinc.LabelIpLocal.Caption := 'No IP found'
    else begin
      GetHostName(TempBuf, SizeOf(TempBuf));
      // find ip
      phe :=GetHostByName(TempBuf);
      if phe = nil then begin end
      else begin
        i := 0;
        pptr := PaPInAddr(Phe^.h_addr_list);
        IPstr := '';
        while pptr^[i] <> nil do begin
          IPstr := StrPas(inet_ntoa(pptr^[i]^));

          // add IPstr where you need...
          Memo1.Add(IPstr);

          Inc(i);
        end;
        WSACleanup;
      end;

    end; // if it was possible to open winsock
end;