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:
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
Curtir tópico
+ 0
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();
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
Clique aqui para fazer login e interagir na Comunidade :)