Desde 1994 en la Red. La pagina de los aficionados a la electronica, informatica y otras curiosidades de la vida. No dudes en visitarnos.
Ahora 0 visitas.| 3408466 Visitas (desde Dic. 2011), hoy: 280 Visitas 698 Pag. Vistas , ultimos 36 dias: 10109 Visitas. 43984 Pag. Vistas. Tu IP: 3.145.94.251
Que ando curioseando:
AutosuficienciaCosas de casaElectronicaEn InternetInformáticaMundo MisticoSin categoríaSociedadTe lo recomiendo

Saber tu IP con Visual Basic 6. Proyecto. (similar al servicio No-ip)

De estas cosas que necesitas, y no se te ocurre otra cosa que hacerla tu mismo.

La idea:

Crear un residente al lado del reloj que grabe en un servidor la IP actual de la instalación para poder conocerla en todo momento, aun que la IP del router cambie.

El proyecto:

cual es mi ip

Consta de dos frames, el frame 2 estará oculto hasta que se pulse el botón de configuración. Este frame generará un INI para guardar los datos de conexión.

Un Winsock1 para realizar la conexion.

Un timer 1 para realizar una actualización al cabo de un rato

Un Tray Notify icon control que nos permite crear el icono en la barra del reloj.

Como funciona:

Se rellenan los datos de configuración, y al darle a guardar, se conectará a un servidor remoto en donde se encuentra la página en PHP que devolverá la Ip externa de la instalación, Al hacer el contacto, el servidor almacenará el nombre del local, la hora y la nueva ip que se podrá leer abriendo el fichero de registro.

El Key es un añadido que he incluido en el proyecto, no incluiré mucha descripción, que nos permite tener varias instalaciones registradas en un solo fichero.

Cuando se establece la conexión, el muñeco se pone verde, y si no, se pone roj0.

Panel de configuración:

2

Panel principal:

3

Residente:

1

El proyecto final, incluye un botón para que un cliente pueda solicitarme soporte.

Código del programa:

' Se permite la utilización y publicacion de este archivo,
' mientras no se modifique la siguientes lineas:
' Programa desarrollado y publicado en la web www.pesadillo.com.
' Este programa realiza las funciones de un servicio como NO-IP y
' permite conocer la ip de conexion de un equipo y guardarla en un servidor de datos
' Puede encontrar disponible este servicio en la web www.pesadillo.com

Option Explicit
Const APPLICATION As String = "Soporte"
'Importante: Antes de mostrar el BallonTip con el metodo ShowBalloon, _
hay que colocar en el systray, es decir hacerlo visible: Tray.Visible = trueOption Explicit
'constante para el temporizador
Const MINUTOS As Integer = 1
'variable de la ruta ini
Dim Path_Archivo_Ini As String
'definimos variable usuario y correo
Dim user As String
Dim email As String
Dim pass As String
Dim pc As String
Dim ipl As String
Dim npc As String

' definimos variable para almacenar ruta de la pagina
Dim sUrl As String

' Funcion api para llamar a un web
Private Declare Function ShellExecute _
                            Lib "shell32.dll" _
                            Alias "ShellExecuteA" ( _
                            ByVal hwnd As Long, _
                            ByVal lpOperation As String, _
                            ByVal lpFile As String, _
                            ByVal lpParameters As String, _
                            ByVal lpDirectory As String, _
                            ByVal nShowCmd As Long) _
                            As Long

'Función api que recupera un valor-dato de un archivo Ini
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" ( _
    ByVal lpApplicationName As String, _
    ByVal lpKeyName As String, _
    ByVal lpDefault As String, _
    ByVal lpReturnedString As String, _
    ByVal nSize As Long, _
    ByVal lpFileName As String) As Long

'Función api que Escribe un valor - dato en un archivo Ini
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" ( _
    ByVal lpApplicationName As String, _
    ByVal lpKeyName As String, _
    ByVal lpString As String, _
    ByVal lpFileName As String) As Long

Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" _
(ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, _
ByVal sProxyBypass As String, ByVal lFlags As Long) As Long

'Funcion para abrir una URL
Private Declare Function InternetOpenUrl Lib "wininet" Alias "InternetOpenUrlA" (ByVal hInternetSession As Long, ByVal lpszUrl As String, ByVal lpszHeaders As String, ByVal dwHeadersLength As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long

Private Declare Function InternetReadFile Lib "wininet.dll" _
(ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, _
lNumberOfBytesRead As Long) As Integer
Private Declare Function InternetCloseHandle Lib "wininet.dll" _
(ByVal hInet As Long) As Integer

Private Sub setTray(Valor As Boolean)

   tray.Visible = Valor
   tray.Enabled = Valor
   'habilitar el temporizador
   'Timer1.Enabled = Valor
End Sub
Private Function Leer_Ini(Path_INI As String, Key As String, Default As Variant) As String
'Funcion para leer valores en el INI
Dim bufer As String * 255
Dim Len_Value As Long
        Len_Value = GetPrivateProfileString(APPLICATION, Key, Default, bufer, Len(bufer), Path_INI)
        Leer_Ini = Left$(bufer, Len_Value)
End Function
Private Function Grabar_Ini(Path_INI As String, Key As String, Valor As Variant) As String
'Funcion para escribir valores en el INI
    WritePrivateProfileString APPLICATION, _
                                         Key, _
                                         Valor, _
                                         Path_INI
End Function
Private Sub Command1_Click()
    'Escribe en el archivo Ini los valores
    Call Grabar_Ini(Path_Archivo_Ini, "user", Text2.Text)
    Call Grabar_Ini(Path_Archivo_Ini, "email", Text3.Text)
    Call Grabar_Ini(Path_Archivo_Ini, "pass", Text4.Text)
    Call Grabar_Ini(Path_Archivo_Ini, "pc", Text5.Text)

    ' Lee las Key y  Les envia el valor por defecto por si no existe
    user = Leer_Ini(Path_Archivo_Ini, "user", "")
    email = Leer_Ini(Path_Archivo_Ini, "email", "")
    pc = Leer_Ini(Path_Archivo_Ini, "pc", "")
    pass = Leer_Ini(Path_Archivo_Ini, "pass", "")

    'Si las casillas no estan vacias, mostrar IP
    If Not Text2.Text = "" Or Text3.Text = "" Or Text5.Text = "" Then
    'Enviar los datos de registro
    Text1.Text = RegistraIP
    'Leer ip desde servidor
    Text1.Text = LeeIP
    'Reiniciar el formulario
    Frame2.Visible = False
    End If

End Sub

Private Sub Command2_Click()
'Abrir una pagina web de soporte
End Sub

Private Sub Command3_Click()
'Mostrar panel configuracion
Frame2.Visible = True
End Sub

Private Sub Command4_Click()
End
End Sub

Private Sub Command5_Click()
    'Escribe en el archivo Ini los valores antes de ir a la pagina
    Call Grabar_Ini(Path_Archivo_Ini, "user", Text2.Text)
    Call Grabar_Ini(Path_Archivo_Ini, "email", Text3.Text)
    Call Grabar_Ini(Path_Archivo_Ini, "pass", Text4.Text)
    Call Grabar_Ini(Path_Archivo_Ini, "pc", Text5.Text)

'Despues de grabar el ini, conectarse a la pagina para que devuelva la IP
ShellExecute hwnd, "open", "http://www.XXXXXXX.com/", vbNullString, vbNullString, "1"

End Sub

Private Sub Command6_Click()
'ocultar configuracion
Frame2.Visible = False
End Sub

Private Sub Command7_Click()
'Borrar fichero INI de configuracion
Kill Path_Archivo_Ini
'Ponemos a cero los campos.
    Text2.Text = ""
    Text3.Text = ""
    Text5.Text = ""
    Text4.Text = ""
    Text1.Text = ""
End Sub

Private Sub Image2_Click()
'copiar al portapapeles
Clipboard.Clear
Clipboard.SetText Text1.Text, vbCFText
If Clipboard.GetFormat(vbCFText) Then
   Text1.Text = Clipboard.GetText(vbCFText)
End If
End Sub
'Abrir una pagina web con la funcion shellexecute.
Private Sub lblLink_Click()
   Dim r As Long
   r = ShellExecute(0, "open", "http://www.pesadillo.com", 0, 0, 1)
End Sub
Private Sub Form_Load()
'Intervalo en segundos para el temporizador
Timer1.Interval = 1000

    'Path del fichero Ini
    Path_Archivo_Ini = App.Path & "\config.ini"

    ' Lee las Key y  Les envia el valor por defecto por si no existe
    user = Leer_Ini(Path_Archivo_Ini, "user", "")
    email = Leer_Ini(Path_Archivo_Ini, "email", "")
    pc = Leer_Ini(Path_Archivo_Ini, "pc", "")
    pass = Leer_Ini(Path_Archivo_Ini, "pass", "")

    'Conectar para recibir ip de conexion
    Text2.Text = user
    Text3.Text = email
    Text5.Text = pc
    Text4.Text = pass

    'Escribir IP local
    Text6.Text = Winsock1.LocalIP
    Text7.Text = Winsock1.LocalHostName

    'variable IPlocal para enviar
    ipl = Text6.Text
    'variable nombre pc para enciar
    npc = Text7.Text

    'Asigna el icono por defecto en el tray
    'Si los campos estan vacios
    If user = "" Or email = "" Or pc = "" Then Set tray.Icon = Image1(1).Picture Else Set tray.Icon = Image1(0).Picture
    If user = "" Or email = "" Or pc = "" Then MsgBox "Por favor," & vbCrLf & " complete los datos" & vbCrLf & " de conexion.", vbExclamation, "Atencion"

    tray.Enabled = True

    'Iniciar minimizado el programa
    Me.Hide
    Form1.Visible = False
    Form1.Caption = "iP"
    Form1.WindowState = 1

    'Conectar para recibir ip de conexion
    Text1.Text = LeeIP

End Sub

Function RegistraIP() As String
    'Al ejecutar el form, hacer la llamada a la pagina.
    Dim hOpen As Long, hFile As Long, sIP As String, Ret As Long
    Dim Longitud As Integer, Ax As Integer, valido As Boolean, Scaracter As String
    'Creamos la ruta de la pagina
    sUrl = "http://www.xxxx.com/xxx.php?user=" & user & "&pc=" & pc & "&key=" & pass & "&ipl=" & ipl
    'Create a buffer for the file we're going to download
    sIP = Space(1000)
    'Create an internet connection
    hOpen = InternetOpen("", 1, vbNullString, vbNullString, 0)
    'Open the url
    hFile = InternetOpenUrl(hOpen, sUrl, vbNullString, ByVal 0&, &H80000000, ByVal 0&)
    'Read the first 1000 bytes of the file
    InternetReadFile hFile, sIP, 1000, Ret
    'clean up
    InternetCloseHandle hFile
    InternetCloseHandle hOpen
    RegistraIP = Trim(Mid(Trim(sIP), 1, 15))
End Function
Function LeeIP() As String
    'Al ejecutar el form, hacer la llamada a la pagina.
    Dim hOpen As Long, hFile As Long, sIP As String, Ret As Long
    Dim Longitud As Integer, Ax As Integer, valido As Boolean, Scaracter As String

      'Creamos la ruta de la pagina
    sUrl = "http://www.xxxxx.com/xxx.php?user=" & user & "&pc=" & pc & "&key=" & pass & "&ipl=" & ipl

    'Create a buffer for the file we're going to download
    sIP = Space(1000)
    'Create an internet connection
    hOpen = InternetOpen("", 1, vbNullString, vbNullString, 0)
    'Open the url
    hFile = InternetOpenUrl(hOpen, sUrl, vbNullString, ByVal 0&, &H80000000, ByVal 0&)
    'Read the first 1000 bytes of the file
    InternetReadFile hFile, sIP, 1000, Ret
    'clean up
    InternetCloseHandle hFile
    InternetCloseHandle hOpen
    LeeIP = Trim(Mid(Trim(sIP), 1, 15))

End Function

Private Sub Form_Resize()

    If Me.WindowState = 1 Then
        ' pone en el systray
        Call setTray(True)

        tray.BalloonTitle = "Titulo del Baloon Tip"
        tray.BalloonText = " Texto del Baloon Tip "

        ' muestra el globo
        tray.ShowBalloon
        ' oculta el form
        Me.Hide
    End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Me.WindowState = 1
    Cancel = True
End Sub

Private Sub mnuRestaurar_Click()
    Me.WindowState = 0
    Me.Show
    Call setTray(False)
End Sub

Private Sub mnuSalir_Click()
    If MsgBox(" Salir ?? ", vbQuestion + vbYesNo) = vbYes Then
        End
    End If
End Sub

Private Sub Text1_Change()
    tray.ToolTip = Text1
End Sub

Private Sub Timer1_Timer()

            ' variable estática para acumular la cantidad de segundos
            Static Temp_Seg As Long
            Static Temp_Min As Long
            ' incrementa cuenta segun temprizador
            Temp_Seg = Temp_Seg + 1
            If Temp_Seg >= 60 Then
            Temp_Min = Temp_Min + 1
            Temp_Seg = 0
            End If

            ' comprueba que los segundos no sea igual a la cantidad de minutos que queremos , en este caso 120 minutos
            If Temp_Min >= MINUTOS Then

            ' reestablece
            Temp_Seg = 0
            Temp_Min = 0

            'temporizador para actualizar la IP
            Static i As Integer
            'If i = Image1.Count - 1 Then
            ' i = 0
            'Else
            ' i = i + 1
            'End If

            'averiguar si se ha asignado una IP desde el servidor
            Dim cantidad As Integer
            Dim caracter As String
            For i = 1 To Len(Text1.Text)
            caracter = Mid(Text1.Text, i, 1)
            'contamos el numero de puntos para saber si se ha asignado una ip
            If LCase(caracter) = "." Then
            cantidad = cantidad + 1
            End If
            Next

            If Text2.Text = "" Or Text3.Text = "" Or Text5.Text = "" Then
            'Ocultar IP si no hay datos de usuario
            Text1.Text = ""
            Set tray.Icon = Image1(1).Picture
            Else
            'Conectar para recibir ip de conexion
            Text1.Text = LeeIP
            Set tray.Icon = Image1(0).Picture
            End If

            'asignamos verde si hay Una IP y rojo si no.
            If cantidad = 3 Then
            Set tray.Icon = Image1(0).Picture
            Else
            Set tray.Icon = Image1(1).Picture
            End If
        End If
End Sub

Private Sub Tray_ContextMenu()
    PopupMenu mnuTray
End Sub

Private Sub Tray_DblClick(Button As Integer)
    If Button = 1 Then
       mnuRestaurar_Click
    End If
End Sub

La segunda parte es el fichero que registra el proceso y reporta la IP externa. Basta con incluir este pequeño php en un servidor y ya tenemos el proyecto terminado.

<!--?php  //Gets the IP address  $ip = getenv("REMOTE_ADDR") ;  //Mensaje es la ip  $msg=$ip; if(isset($_GET['user'])){    $user=$_GET['user'];    $pc=$_GET['pc'];    $user = htmlspecialchars($user);    $pc = htmlspecialchars($pc);  $cadena_final = "\r\n".$ip.",".$user.",".$pc; //escribimos la IP en un fichero CSV  $fh = fopen("xxxxxx.csv","a");  fputs($fh,$cadena_final);  fclose($fh);   if ($pc== null) {     $msg="Estacion?";     } else {$msg=$ip;}   if ($email== null) {       $msg="Email?";  } //escribimos el mensaje que leera el programa  Echo $msg;  } Else { Echo "Usuario?"; } ?-->

El php envía mensajes al programa mediante el comando echo.

Escribe un comentario

Tu comentario