Recuperar la IP Publica

Iniciado por LeandroA, 2 Agosto 2007, 18:06 PM

0 Miembros y 1 Visitante están viendo este tema.

LeandroA

Buenas se que quienes tienen Router el winsock no devuelve la ip publica, yo en mi caso como no tengo router no se como hacerlo, pero me gustaria saber como se puede conseguir la ip publica sin tener que recurrir a una web. (estoy ablando de hacerlo por codigo)

bien un amigo me paso este ejemplo


'In Module1:

'******************************************************************
'Created By Verburgh Peter.
' 07-23-2001
' verburgh.peter@skynet.be
'-------------------------------------
'With this small application , you can detect the IP's installed on your computer,
'including subnet mask , BroadcastAddr..
'
'I've wrote this because i've a programm that uses the winsock control, but,
'if you have multiple ip's  installed on your pc , you could get by using the Listen
' method the wrong ip ...
'Because Winsock.Localip => detects the default ip installed on your PC ,
' and in most of the cases it could be the LAN (nic) not the WAN (nic)
'So then you have to use the Bind function ,to bind to your right ip..
'but how do you know & find that ip ?
'you can find it now by this appl.. it check's in the api.. IP Table..
'******************************************************************


Const MAX_IP = 5   'To make a buffer... i dont think you have more than 5 ip on your pc..

Type IPINFO
     dwAddr As Long   ' IP address
    dwIndex As Long '  interface index
    dwMask As Long ' subnet mask
    dwBCastAddr As Long ' broadcast address
    dwReasmSize  As Long ' assembly size
    unused1 As Integer ' not currently used
    unused2 As Integer '; not currently used
End Type

Type MIB_IPADDRTABLE
    dEntrys As Long   'number of entries in the table
    mIPInfo(MAX_IP) As IPINFO  'array of IP address entries
End Type

Type IP_Array
    mBuffer As MIB_IPADDRTABLE
    BufferLen As Long
End Type

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Declare Function GetIpAddrTable Lib "IPHlpApi" (pIPAdrTable As Byte, pdwSize As Long, ByVal Sort As Long) As Long
Sub main()
Form1.Show
End Sub

'converts a Long  to a string
Public Function ConvertAddressToString(longAddr As Long) As String
    Dim myByte(3) As Byte
    Dim Cnt As Long
    CopyMemory myByte(0), longAddr, 4
    For Cnt = 0 To 3
        ConvertAddressToString = ConvertAddressToString + CStr(myByte(Cnt)) + "."
    Next Cnt
    ConvertAddressToString = Left$(ConvertAddressToString, Len(ConvertAddressToString) - 1)
End Function

Public Sub Start()
Dim Ret As Long, Tel As Long
Dim bBytes() As Byte
Dim Listing As MIB_IPADDRTABLE



On Error GoTo END1
    GetIpAddrTable ByVal 0&, Ret, True

    If Ret <= 0 Then Exit Sub
    ReDim bBytes(0 To Ret - 1) As Byte
    'retrieve the data
    GetIpAddrTable bBytes(0), Ret, False
     
    'Get the first 4 bytes to get the entry's.. ip installed
    CopyMemory Listing.dEntrys, bBytes(0), 4
    'MsgBox "IP's found : " & Listing.dEntrys    => Founded ip installed on your PC..
    Form1.AutoRedraw = True
    Form1.Print Listing.dEntrys & "   IP addresses found on your PC !!"
    Form1.Print "----------------------------------------"
    For Tel = 0 To Listing.dEntrys - 1
        'Copy whole structure to Listing..
       ' MsgBox bBytes(tel) & "."
        CopyMemory Listing.mIPInfo(Tel), bBytes(4 + (Tel * Len(Listing.mIPInfo(0)))), Len(Listing.mIPInfo(Tel))
         Form1.Print "IP address                   : " & ConvertAddressToString(Listing.mIPInfo(Tel).dwAddr)
         Form1.Print "IP Subnetmask            : " & ConvertAddressToString(Listing.mIPInfo(Tel).dwMask)
         Form1.Print "BroadCast IP address  : " & ConvertAddressToString(Listing.mIPInfo(Tel).dwBCastAddr)
         Form1.Print "**************************************" & vbCrLf
         Form1.Refresh
    Next

'MsgBox ConvertAddressToString(Listing.mIPInfo(1).dwAddr)
Exit Sub
END1:
MsgBox "ERROR"
End Sub



Private Sub Form_Load()
Module1.Start
End Sub


en su caso le aparecio en la tercera posicion su ip publica
alguno de los que tengan un router se anima a ver si puede obtener unicamente esa ip

Gracias y saludos

aca hay otro codigo parecido, aver si este muestra la ip publica
http://www.recursosvisualbasic.com.ar/htm/listado-api/api-55-ip-GetIpAddrTable.htm

Freeze.

Con los sockets...

Puede ser con la API o con el control Winsock...

Muy Facil...

LeandroA

no no noes facil creo que no me entendiste, no dije ip privada dije IP ""PUBLICA"", se que este codigo lo tira pero me tira otras ip mas el tema es aislar es ip publica y como no tengo router para provar no se como hacerlo esdecir mi ip privada y mi ip publica son iguales.

~~

No, no funciona, el primer codigo te muestra la ip local y la loop ip (12.0.0.1) vamos q un ipconfig /all es mas completo q todo eso...
El segundo cogigo tampoco funciona, te debuelve la local...

Creo q lo mejor q puedes hacer es contactar con alguna web tipo cualesmiip.com y leer lo q te devuelve..

Mad Antrax

Aquí el source, solo necesitas agregar el control MSWinsck o en su defecto el CSocketMaster:

Código (vb) [Seleccionar]
Private Sub Command1_Click()
    Label1.Caption = "Cerrando conexión..."
    WS.Close
    DoEvents
    WS.Connect "checkip.dyndns.org", 80
    Label1.Caption = "Conectando..."
    DoEvents
End Sub

Private Sub WS_Connect()
    Label1.Caption = "Conectado!"
    WS.SendData "GET / HTTP/1.1" & vbCrLf & vbCrLf
End Sub

Private Sub WS_DataArrival(ByVal bytesTotal As Long)
    Dim Buffer As String
    Dim Datos() As String
   
    WS.GetData Buffer, vbString
    If InStr(Buffer, "Current IP") <> 0 Then
        Datos = Split(Buffer, "<")
        Datos = Split(Datos(6), ":")
        Label1.Caption = Trim(Datos(1))
    Else
        Label1.Caption = "IP no encontrada"
    End If
End Sub

Private Sub WS_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
    On Error Resume Next
    Label1.Caption = "Error!"
    MsgBox Number & " - " & Description
End Sub


El código es de lo más simple, se conecta a la web checkip.dyndns.org y manda un GET al index, explora el código que devuelve el webserver para mostrar tan solo la IP pública. Es un método que no me gusta porque en el momento que checkip.dyndns.org deje de funcionar o cambie el formato se jodió nuestro código.

El código no es mío, alguien de este foro me lo pasó hace bastante tiempo por MP y no recuerdo el nombre, sorry.
No hago hacks/cheats para juegos Online.
Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.

LeandroA

Gracias pero es raro tiene que aver alguna forma de obtenerlo sin nesidad de hacer una peticion web , osea si ipconfig /all te la devuelve  tiene que aver una forma no?

a la ip publica es a la que le llaman ip wan?