Fórum Pegar IP através do WinSock - Retornar IP correto #559533

25/07/2016

0

Bom dia,

Estou usando o método abaixo para retornar o IP do computador, porém se eu tenho uma VPN ativa no computador, ele esta pegando primeiro o IP da VPN e não o da máquina.
Gostaria de saber se seria possível controlar qual IP ele me retornar ou uma outra forma para eu poder pegar o IP real do computador (de uma placa de rede) e não da VPN e também se seria possível pegar apenas IPV4 e não IPV6.

Obrigado e aguardo.

Segue código:

function GetLocalIP: String;
var
   ipwsa:TWSAData;
   p:PHostEnt;
   s:array[0..128] of char;
   c : PAnsiChar;
begin
   c := '';
   try
      wsastartup(257,ipwsa);
      GetHostName(@s, 128);
      p := GetHostByName(@s);
      c := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
   except
      on E: Exception do
      begin
         TVSMLogUtils.GetInstance.LogE(E.Message);
      end;
   end;
   Result := String(c);
end;
Diego Pego

Diego Pego

Responder

Posts

25/07/2016

Gutierry Pereira

Boa noite,
pode utilizar o GetAdaptersInfo, com isso varias informações dos adaptadores d redes podem ser obtidas.
Você terá que percorrer todos os adaptadores e pegar um a um, é difícil determinar qual seu adaptador principal.
Para percorrer os adaptadores e pegar o ip de cada um pode se fazer algo semelhante a isso :


uses IpTypes, IpHlpApi


procedure TGETAdaptadores.listaPlacaDeRede;
var
AdapterInfo : Pointer;
pAdapterInfo : PIP_ADAPTER_INFO;
dwBufLen, dwStatus : LongWord;
begin
dwBufLen := 0;
AdapterInfo := Nil;

GetAdaptersInfo(PIP_ADAPTER_INFO (AdapterInfo), dwBufLen);
if (dwBufLen > 0) then
begin
GetMem (AdapterInfo, dwBufLen);
dwStatus := GetAdaptersInfo(PIP_ADAPTER_INFO (AdapterInfo), dwBufLen);

if (dwStatus = ERROR_SUCCESS) then
begin
pAdapterInfo := PIP_ADAPTER_INFO (AdapterInfo);

repeat
{ Processa informações do adaptador atualmente posicionado }
if (pAdapterInfo.Type_ <> 9) then
TrataAdaptador (pAdapterInfo);

{ Próximo adaptador da lista }
pAdapterInfo := pAdapterInfo.Next;
until (pAdapterInfo = Nil);

FreeMem (AdapterInfo);
end;
end;
end;

procedure TGETAdaptadores.TrataAdaptador(pAdapterInfo : PIP_ADAPTER_INFO);
var i : Integer;
IP : String;
begin
IP := '';
for i := 0 to Length( pAdapterInfo.IpAddressList.IpAddress.S) do
IP := IP + pAdapterInfo.IpAddressList.IpAddress.S[i];

Memo1.Lines.Add('CI:' + IP);
end;


Para chamar o listar as placas execute esse comando: listaPlacaDeRede();
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar