Página 1 de 2

IP da placa de rede

Enviado: 09 Abr 2009 07:38
por asimoes
Amigos,

Tem alguma função do xHarbour que me diga qual o ip da placa de rede?

[]´s

Re: IP da placa de rede

Enviado: 09 Abr 2009 08:39
por TerraSoftware
Caro colega, o que vc deseja não seria o endereco mac da placa de rede?
Se for, acho que tenho aqui uma funçao em C que retorna, vou procurar e deixar na agulha, qualquer coisa, nos retorne.
Se for o ip da maquina, tambem existe funcao para tal.

Re: IP da placa de rede

Enviado: 09 Abr 2009 09:01
por asimoes
Amigos,

Já resolvi com o código abaixo:

Código: Selecionar todos

FUNCTION PegaIP()
   PRIVATE aResult:={}
   aResult:=GetIP()
   cIP:=aResult[1]
   DbUseArea(.T.,"DBFNTX","Conexao","Conexao",.F.)
   If !Empty(cIP)
      lAdiciona:=.T.
      Do While !Eof()
         If cIP In CONEXAO->IP
            lAdiciona:=.F.
         EndIf
         DbSkip()
      EndDo
      If lAdiciona
         DbAppend()
         FIELD->Ativo:="S"
         FIELD->IP:=cIP
      EndIf
      CONEXAO->(DbCloseArea())
   Else
      Alert("NÆo foi possivel atribuir n§ de IP")
   EndIf
RETURN cIp

FUNCTION GetIP()
    local oLoc, oSrv, oJbs, oJob, ip
    local Result := {} 
    Try    
       oLoc := CREATEOBJECT( "wbemScripting.SwbemLocator" )
       oSrv := oLoc:ConnectServer()
       oJbs := oSrv:ExecQuery( "SELECT IPAddress FROM Win32_NetworkAdapterConfiguration" )
       FOR EACH oJob IN oJbs
           ip   := oJob:IPAddress
           if Valtype(ip) == 'A' .and. Len(ip) > 0
              ip := ip[1]
           else
              ip := ToString(ip)
           end
           if Empty(ip) 
              loop
           end
           AADD( Result, ip )
       NEXT
    catch
    end    
RETURN Result

/*
 * Função auxiliar que converter os valores passados para string. Coisa simples
 */    
STATIC FUNCTION ToString(Arg1)
   LOCAL tipo := ValType(Arg1)
   if tipo == 'C' ; return Alltrim(Arg1) ; end
   if tipo == 'N' ; return Alltrim(Str(Arg1)) ; end
   if tipo == 'U' ; return '' ; end        
RETURN VALTOPRG(Arg1)
[]´s

Re: IP da placa de rede

Enviado: 11 Abr 2009 14:52
por sygecom
Ou pode usar tmb:

Código: Selecionar todos

*********************
PROCEDURE Verefica_Ip
*********************
LOCAL aHosts
LOCAL cName
Local cEstacao:=netname(.f.)
InetInit()
aHosts := InetGetHosts( cEstacao )
IF aHosts == NIL
   aHosts := InetGetAlias( cEstacao )
ENDIF
IF Empty(aHosts)
   aHosts := InetGetAlias( cEstacao )
ENDIF
InetCleanup()
RETURN  ahosts[1 ]

Re: IP da placa de rede

Enviado: 13 Abr 2009 19:32
por cl@udio
TerraSoftware
Esta sua funcao funciona em windows e linux.
Se puder nos passar pois ate hoje nao consegui uma que funcionasse.
[]s
claudio

Re: IP da placa de rede

Enviado: 14 Abr 2009 11:41
por TerraSoftware
Caro colega claudio,
A funcao que tenho para retornar o ip da maquina é a mesma que o sygecom ja postou, alias, acho ate que foi ele que me arrumou (obrigado heim), uso ela em windows, funciona perfeitamente, em linux nunca usei, alias nao compilo para linux, ainda.
A funcao que retorna o endereco mac da placa de rede, nao encontrei ela ainda, mas sei que tenho, assim que encontrar postarei.

Re: IP da placa de rede

Enviado: 14 Abr 2009 12:08
por sygecom
Olá Claudio,
Essa função que potei usa a TIP.LIB e como a TIP.LIB se encontra na versão Linux do xharbour tmb. tudo me leva a crer que ela funciona com Linux, é só uma questão de testar, assim que der vou atualizar meu xharbour e vou testar no CENTOS 5.2

Re: IP da placa de rede

Enviado: 15 Abr 2009 09:54
por asimoes
Olá TerraSoft,

A função que eu publiquei, modificada de um original tambem retorna o mac address entre outras informações quem estiver interessado eu publico aqui.

Leonardo, valeu pela dica. Verifica_Ip, simples e objetiva.

[]´s

Re: IP da placa de rede

Enviado: 16 Abr 2009 11:15
por cl@udio
Desculpe pessoal
Entendi errado.
O que eu gostaria era uma funcao que retornasse o mac address da placa de rede.
[]s
claudio

Re: IP da placa de rede

Enviado: 16 Abr 2009 15:51
por asimoes
Olá Claudio,

Segue a dica do nosso colega Vailton.

Código: Selecionar todos


FUNCTION Teste()
   mb   := GetMBInfo()
   bios := GetBiosInfo()
   macs := GetMACAddr(.t.)
   ips  := GetNICs(.t.)
   
   * Exibe o modelo e versão da placa-mãe:
   ? valtoprg(mb)

* Exibe a versão e data da bios:
? valtoprg(bios)

* Exibe os endereços MACs encotrados no sistema:
? valtoprg(macs)

* Mostra todos os endereços IPs disponíveis:
? valtoprg(ips)
return


Eis o código-fonte das rotinas desenvolvidas, qualquer comentário e sugestões fiquem à vontade para se expressarem pois estou à disposição:


#include 'common.ch'
/*
 * Retorna os nomes, IPs, Mascara de redes e os endereçõs MAC das placas de rede
 * instaladas na CPU atual. O parametro opcional indica se deve-se filtrar apenas 
 * as interfaces de rede válidos!
 * Versão 1.0, 24/2/2007 11:14:23 - Vailton Renato da Silva
 *
 * Requer Windows Vista, Windows XP, Windows 2000 Professional ou Windows NT WK 4.0 SP4 >
 * link: http://msdn2.microsoft.com/en-gb/library/aa394217.aspx
 */   
FUNCTION GetNICs( lOnlyValids )   
    local oLoc, oSrv, oJbs, oJob, nic, mac, ip, msk, gtw
    local Result := {} 
    
    default lOnlyValids to False

Try
oLoc := CREATEOBJECT( "wbemScripting.SwbemLocator" )
oSrv := oLoc:ConnectServer()
oJbs := oSrv:ExecQuery( "SELECT Description, IPAddress, IPSubnet, IPConnectionMetric," +;
"MACAddress, DefaultIPGateway FROM Win32_NetworkAdapterConfiguration" )

FOR EACH oJob IN oJbs
nic := ToString(oJob: Description)
ip := oJob:IPAddress

if Valtype(ip) == 'A' .and. Len(ip) > 0
ip := ip[1]
else
ip := ToString(ip)
end

mac := oJob:MACAddress
if Empty(mac)
if !lOnlyValids
mac := '00:00:00:00:00:00'
else
loop
end
end

msk := oJob:IPSubnet
if Valtype(msk) == 'A' .and. Len(msk) > 0
msk := msk[1]
else
msk := ToString(msk)
end

gtw := oJob: DefaultIPGateway

if Valtype(gtw) == 'A' .and. Len(gtw) > 0
gtw := gtw[1]
else
gtw := ToString(gtw)
end

if Empty(ip) .and. lOnlyValids
loop
end
AADD( Result, nic + ', (' + ip + ', ' +msk + ', ' + gtw + ') ['+mac+']' )
NEXT

catch
*
end
RETURN Result


/*
* Retorna os nomes e os endereços MAC das placas de rede instaladas na
* CPU atual. O parametro opcional indica se deve-se filtrar apenas NIC válidos!
* Versão 1.0, 24/2/2007 10:23:49 - Vailton Renato da Silva
*
* Requer Windows Vista, Windows XP, Windows 2000 Professional ou Windows NT WK 4.0 SP4 >
* link: http://msdn2.microsoft.com/en-gb/library/aa394216.aspx
*/
FUNCTION GetMACAddr( lOnlyValids )
local oLoc, oSrv, oJbs, oJob, mb, mac, typ
local Result := {}

default lOnlyValids to False

Try
oLoc := CREATEOBJECT( "wbemScripting.SwbemLocator" )
oSrv := oLoc:ConnectServer()
oJbs := oSrv:ExecQuery( "SELECT * FROM Win32_NetworkAdapter "+;
"WHERE ConfigManagerErrorCode = 0" )

FOR EACH oJob IN oJbs
mb := ToString(oJob: Description)
mac := ToString(oJob:MACAddress)
typ := ToString(oJob:AdapterType)

if Empty(mac)
if !lOnlyValids
mac := '00:00:00:00:00:00'
else
loop
end
end

if Empty(typ) .and. lOnlyValids
loop
end

AADD( Result, mb + ', ' + mac + ' ['+typ+']' )
NEXT

catch
*
end
RETURN Result

/*
* Puxa as informações da BIOS do micro atual e retorna string formatada.
* Versão 1.0, 24/2/2007 10:06:51 - Vailton Renato da Silva
*
* Requer Windows Vista, Windows XP, Windows 2000 Professional ou Windows NT WK 4.0 SP4 >
* link: http://msdn2.microsoft.com/en-gb/library/aa394077.aspx
*/
FUNCTION GetBiosInfo()
local oLoc, oSrv, oJbs, oJob, mb, bd

Try
oLoc := CREATEOBJECT( "wbemScripting.SwbemLocator" )
oSrv := oLoc:ConnectServer()
oJbs := oSrv:ExecQuery( "SELECT * FROM Win32_BIOS" )
mb := ''

FOR EACH oJob IN oJbs
MB += ToString(oJob:Manufacturer) + ', '
bd := ToString(oJob:ReleaseDate)

if Empty( bd )
bd := '00/00/0000'
else
bd := Subst( bd, 7, 2 ) + '/' + Subst( bd, 5, 2 ) + '/' + Subst( bd, 1, 4 )
end

MB += bd + ' #'
MB += ToString(oJob:SerialNumber) + ' ('
MB += ToString(oJob:Version) + ')'
NEXT

catch
mb := ''
end
RETURN mb

/*
* Puxa as informações da MotherBoard instalada no PC e retorna string formatada
* Versão 1.0,24/2/2007 09:45:32 - Vailton Renato da Silva
*
* Requer Windows Vista, Windows XP, Windows 2000 Professional ou Windows NT WK 4.0 SP4 >
* link: http://msdn2.microsoft.com/en-gb/library/aa394072.aspx
*/
FUNCTION GetMBInfo()
local oLoc, oSrv, oJbs, oJob, mb

Try
oLoc := CREATEOBJECT( "wbemScripting.SwbemLocator" )
oSrv := oLoc:ConnectServer()
oJbs := oSrv:ExecQuery( "SELECT * FROM Win32_BaseBoard" )
mb := ''

FOR EACH oJob IN oJbs
MB += ToString(oJob:Manufacturer) + ', ' + ;
ToString(oJob: Product) + ' #' +;
ToString(oJob:SerialNumber)
NEXT

catch
mb := ''
end
RETURN mb

/*
* Função auxiliar que converter os valores passados para string. Coisa simples
* 24/2/2007 09:20:32
*/
STATIC;
FUNCTION ToString(Arg1)
LOCAL tipo := ValType(Arg1)

if tipo == 'C' ; return Alltrim(Arg1) ; end
if tipo == 'N' ; return Alltrim(Str(Arg1)) ; end
if tipo == 'U' ; return '' ; end
RETURN VALTOPRG(Arg1)

Re: IP da placa de rede

Enviado: 17 Abr 2009 13:20
por jamazevedo
Em Linux

Testei a rotina do Vailton e retorna em branco.

Já a rotina do Sygecom retorna o localhost, ou seja, 127.0.1.1

Re: IP da placa de rede

Enviado: 18 Abr 2009 18:23
por sygecom
jamazevedo escreveu:Em Linux

Testei a rotina do Vailton e retorna em branco.

Já a rotina do Sygecom retorna o localhost, ou seja, 127.0.1.1
Tente colocar TRUE ( .T. ) dentro do NETNAME(.T.)
Ficaria assim:

Código: Selecionar todos

Local cEstacao:=netname(.t.)

Re: IP da placa de rede

Enviado: 22 Abr 2009 12:16
por jamazevedo
Em Linux continua retornando 127.0.1.1.

Re: IP da placa de rede

Enviado: 27 Abr 2009 15:41
por cl@udio
Mas isto seria so para xharbour windows.
Para xharbour linux nao funcionaria.
Correto.
[]s
claudio

Re: IP da placa de rede

Enviado: 27 Abr 2009 16:58
por sygecom
É eu testei no Centos e não retorna o IP correto mesmo. Não sei como lhe ajudar.
cl@udio escreveu:Mas isto seria so para xharbour windows.
Para xharbour linux nao funcionaria.
Correto.
Como a TIP tem para Window e para Linux, achei que poderia rodar em ambos, tanto é que a hb_sendmail() da TIP, roda em linux.