Tecnologías TCP/IP y UDP.

Este proyecto ha sido propuesto por José Manuel Heras Muñoz. El proyecto consta de un programa servidor de datos y otro cliente que realiza peticiones de datos al servidor. Se usan tecnologías TCP/IP y UDP. La información suministrada:

Descripción del proyecto Completo

  • Se tratará de construir un programa para la administración de redes, solo si es necesario, será del tipo “cliente servidor”.
  • Aunque en un principio no será una red del tipo “cliente-servidor”, vamos a llamar cliente al ordenador que ejecuta el programa, y vamos a llamar servidor a aquel que ofrece la información o ejecuta la petición del cliente.

Administración de Redes LAN

Detalles del funcionamiento del programa:

El programa consta básicamente de dos partes.

  • Cliente: Realiza una llamada con mascara 255.255.255.255 con protocolo UDP y envía un dato “cliente”. Una vez que los servidores disponibles responden por TCP, el cliente recoge las direcciones IP de los servidores y a partir de ahí comunicará con ellos con protocolo TCP. Siempre permanecerá a la escucha de que un equipo le envíe un dato por protocolo UDP “servidor”, enviado desde un programa servidor recién conectado. También permanecerá a la escucha mediante TCP (a través de esta conexión se comunican servidores y cliente ya conectados)
  • Servidor: Al arrancar realiza una llamada con mascara 255.255.255.255 con protocolo UDP y envía un dato “servidor”. Permanece a la escucha con protocolo UDP por si recibe una llamada con el dato “cliente”. Una vez que ha recibido un mensaje del cliente, recoge su dirección IP y le contesta utilizando protocolo TCP.
  • Arrancando los programas…

  • Arranca un servidor1 y envía por UDP el mensaje “servidor”
  • Como no hay clientes, no ocurre nada (el servidor permanece a la escucha UDP)
  • Arranca un cliente y envía por UDP el mensaje “cliente”.
  • El cliente espera escuchando por UDP y por TCP.
  • El servidor1 recibe el mensaje y contesta por TCP.
  • El cliente recibe un mensaje del servidor1 “servidor” por TCP Entonces muestra la IP en pantalla (a partir de aquí, el cliente le ira pidiendo los datos que se necesitan por TCP al servidor)
  • Arranca un servidor2 y envía por UDP el mensaje “servidor”
  • El servidor1 recibe el mensaje pero no hace nada.
  • El cliente recibe el mensaje del servidor2 “servidor” por UDP, muestra su IP por pantalla (a partir de aquí, el cliente le ira pidiendo los datos que se necesitan por TCP al servidor)
  •  

    El programa completo realizará las siguientes funciones:

  • Dado un rango de IP’s, escanearlas y decir que máquinas se encuentran en la red y cuales no.
  • De las máquinas existentes en la red, visualizar sus recursos compartidos.

      Se intentará además:

    • Que remotamente se puedan añadir, quitar y/o modificar los recursos compartidos de las máquinas remotas.
    • Actuar desde el ordenador “cliente” sobre la pantalla del “servidor” mediante el teclado y/o el ratón.
    • Realizar instalaciones de programas de manera múltiple (el “cliente” instalará los programas en todos los “servidores”).
    • Visualizar la información de los programas instalados.
    • Visualizar la información de los programas activos.
    • Detención remota de procesos.
    • Ejecución remota de procesos.
    • Si quieres aportar algo para mejorar este proyecto deja algún comentario en las observaciones.

       

      Código Propuesto por CrAzY hOuSe

      Pseudocodigo del Programa

    • El Cliente al arrancar pregunta si hay algún servidor “Server?”, y espera respuestas.
    • Si el Servidor esta activo responde con “Server#”, indicándole su dirección IP y el Puerto por el que activa para que se conecte en ese servidor, y se abre la conexión TCP con ese puerto.
    • El cliente recibe la información y activa el TCP para conectarse con el servidor con la IP y el Puerto indicados.
    • El Servidor al arrancar informa “a los cuatro vientos” 😉 que es un servidor “Server!” e indica cual es su IP.
    • El cliente al recibirlo, le pide la Server que active un TCP para él. “Server?”
    • El Servidor le responde con “Server#”, indicándole la IP y el puerto.
    • Se ha incluido un botón para preguntar la fecha al o a los servers para probar la comunicación TCP entre el cliente y el servidor.
    • Propuestas

    • Si se quiere un sistema robusto, se debe prescindir del control WinSock de Microsoft. Te recomiendo los controles IPWorks, son más robustos y fiables. http://www.dev-soft.com
    • Los ejemplos que envío, son esqueletos sin control de errores ni nada parecido. De todas maneras los programas funcionan, lo único que habría que añadir sería un control de TimeOut’s, es decir, preguntar de vez en cuando el cliente al server o viceversa si sigue activo, ya que algunas veces se cae la comunicación y la conexión sigue activa. No me refiero a este programa en concreto, ocurre con todos los socket.
    • Como podrás observar los envíos de los datos son diferidos, habría que crear una cola de mensajes para poder gestionar la información con un gran número de clientes. No es conveniente hacer un “SendData” dentro del “DataArrival”
    • Habría que controlar cuando recibimos un server si ya estábamos conectados o no… tirar la anterior conexión y volver a conectar.
    • Código programa Cliente
      Option Explicit
      Dim SalirBucle As Boolean
      Dim EnviarUDP As String
      Dim EnviarTCP As String
      Private Sub Command1_Click()
          ' Preguntar la fecha a los servidores
          ' Esto es para probar la comunicación entre los programas
          ' via TCP
          Text1.Text = """"
          EnviarTCP = ""SerDate""
      End Sub
      Private Sub Form_Load()
          'Arranca el cliente y envia un mensaje diciendo quien es
          SocketUDP.Protocol = sckUDPProtocol
          SocketUDP.RemoteHost = ""255.255.255.255""
          SocketUDP.LocalPort = 2345
          SocketUDP.RemotePort = 2346
          ' Le damos un respiro al sistema
          DoEvents
          ' Preguntamos is hay algún Servidor
          EnviarUDP = ""Server?""
          ' Mostramos el Formulario
          Me.Show
          ' Entramos en un bucle de control
          ' para los envios de los datos
          ' y poder controlar otros detalles
          Do
              If EnviarUDP  """" Then EnviarPorUDP
              If EnviarTCP  """" Then EnviarPorTCP
              DoEvents
          Loop Until SalirBucle
      End Sub
      Sub EnviarPorUDP()
          ' Proceso de envio de datos via UDP
          Debug.Print ""Enviando: "" & EnviarUDP
          ' Si se especifica una IP concreta se dirige
          ' exclusivamente le mensaje a esa dirección
          If InStr(EnviarUDP, ""·"") Then
              SocketUDP.RemoteHost = Left$(EnviarUDP, InStr(EnviarUDP, ""·"") - 1)
              EnviarUDP = Mid$(EnviarUDP, InStr(EnviarUDP, ""·"") + 1)
          Else
              ' Sino, es global
              SocketUDP.RemoteHost = ""255.255.255.255""
          End If
          ' Se envian los datos
          SocketUDP.SendData EnviarUDP
          DoEvents
          ' Se limpia el buffer
          EnviarUDP = """"
      End Sub
      Sub EnviarPorTCP()
          Dim Ic As Integer
          LstTCP.AddItem ""Enviando: "" & EnviarTCP
          ' Se recorren todo el array de controles
          For Ic = 1 To SocketTCP.Ubound
              ' Si el socket esta conectado se envian
              ' los datos
              If SocketTCP(Ic).State  sckClosed Then
                  ' Se envian los datos
                  SocketTCP(Ic).SendData EnviarTCP
                  DoEvents
              End If
          Next Ic
          ' Se limpia el buffer
          EnviarTCP = """"
      End Sub
      Private Sub Form_Unload(Cancel As Integer)
          ' Salimos del bucle de control
          SalirBucle = True
      End Sub
      Private Sub SocketTCP_Close(Index As Integer)
          ' Si se cierra la conexión se descarga el socket
          LstTCP.AddItem ""SocketTCP("" & Format(Index) & "")_Close""
          Unload SocketTCP(Index)
      End Sub
      Private Sub SocketTCP_DataArrival(Index As Integer, ByVal bytesTotal As Long)
          ' Gestiona la recepción de datos
          Dim LineaDatos As String, Comando As String, Parametros As String
          ' Se carga el array
          SocketTCP(Index).GetData LineaDatos, vbString
          LstTCP.AddItem "">"" & LineaDatos & "" · "" & SocketUDP.RemoteHostIP
          Comando = UCase$(Left$(LineaDatos, 7))
          If Len(LineaDatos) > 7 Then Parametros = Mid$(LineaDatos, 8)
          ' Se comprueba la orden
          Select Case Comando
          Case ""DATE!!!""
              ' Se envian los datos al cliente
              Text1.Text = Text1.Text & SocketTCP(Index).RemoteHostIP & "" : "" & Parametros & vbCrLf
          Case Else
              ' Si se recibe algo no esperado
              LstTCP.AddItem ""Orden Desconocida...""
          End Select
      End Sub
      Private Sub SocketUDP_DataArrival(ByVal bytesTotal As Long)
          Dim LineaDatos As String, Comando As String, Parametros As String
          ' Se carga el Array
          SocketUDP.GetData LineaDatos, vbString
          List1.AddItem LineaDatos
          Comando = UCase$(Left$(LineaDatos, 7))
          If Len(LineaDatos) > 7 Then Parametros = Mid$(LineaDatos, 8)
          ' Se comprueba la orden
          Select Case Comando
          Case ""SERVER!""
              ' Se recibe un mensaje de que se ha levantado un
              ' nuevo server
              EnviarUDP = SocketUDP.RemoteHostIP & ""·Server?""
          Case ""SERVER#""
              ' Se recibe un mensaje del Server indicando
              ' el puerto de conexión
              LstServer.AddItem ""Servidor: "" & Parametros
              If InStr(Parametros, "":"")  0 Then
                  ' Se crea un control TCP para que se conecte el cliente
                  Load SocketTCP(SocketTCP.Ubound + 1)
                  ' Se inicia el Socket con la IP y el puerto
                  SocketTCP(SocketTCP.Ubound).RemoteHost = Left$(Parametros, InStr(Parametros, "":"") - 1)
                  SocketTCP(SocketTCP.Ubound).RemotePort = Mid$(Parametros, InStr(Parametros, "":"") + 1)
                  SocketTCP(SocketTCP.Ubound).Connect
              End If
          Case Else
              ' Si se recibe algo no esperado
              List1.AddItem ""Orden Desconocida...""
          End Select
      End Sub
      Código programa Servidor
      Option Explicit
      Dim SalirBucle As Boolean
      Dim EnviarUDP As String
      Dim EnviarTCP As String
      Private Sub Form_Load()
          Label1.Caption = """"
          'Arranca el servidor y envia un mensaje diciendo quien es
          SocketUDP.Protocol = sckUDPProtocol
          SocketUDP.RemoteHost = ""255.255.255.255""
          SocketUDP.LocalPort = 2346
          SocketUDP.RemotePort = 2345
          ' Le damos un respiro al sistema
          DoEvents
          ' ""Proclamamos"" por la red quien soy
          EnviarUDP = ""Server!"" & SocketUDP.LocalIP
          ' Mostramos el Formulario
          Me.Show
          ' Entramos en un bucle de control
          ' para los envios de los datos
          ' y poder controlar otros detalles
          Do
              If EnviarUDP  """" Then EnviarPorUDP
              If EnviarTCP  """" Then EnviarPorTCP
              DoEvents
          Loop Until SalirBucle
      End Sub
      Sub EnviarPorUDP()
          ' Proceso de envio de datos via UDP
          Debug.Print ""Enviando: "" & EnviarUDP
          ' Si se especifica una IP concreta se dirige
          ' exclusivamente le mensaje a esa dirección
          If InStr(EnviarUDP, ""·"") Then
              SocketUDP.RemoteHost = Left$(EnviarUDP, InStr(EnviarUDP, ""·"") - 1)
              EnviarUDP = Mid$(EnviarUDP, InStr(EnviarUDP, ""·"") + 1)
          Else
              ' Sino, es global
              SocketUDP.RemoteHost = ""255.255.255.255""
          End If
          ' Se envian los datos
          SocketUDP.SendData EnviarUDP
          DoEvents
          ' Se limpia el buffer
          EnviarUDP = """"
      End Sub
      Sub EnviarPorTCP()
          Dim Ic As Integer
          LstTCP.AddItem ""Enviando: "" & EnviarTCP
          ' Se recorren todo el array de controles
          For Ic = 1 To SocketTCP.Ubound
              ' Si el socket esta conectado se envian
              ' los datos
              If SocketTCP(Ic).State  sckClosed Then
                  ' Se envian los datos
                  SocketTCP(Ic).SendData EnviarTCP
                  DoEvents
              End If
          Next Ic
          ' Se limpia el buffer
          EnviarTCP = """"
      End Sub
      Private Sub Form_Unload(Cancel As Integer)
          ' Salimos del bucle de control
          SalirBucle = True
      End Sub
      Private Sub SocketTCP_Close(Index As Integer)
          ' Si se cierra la conexión se descarga el socket
          LstTCP.AddItem ""SocketTCP("" & Format(Index) & "")_Close""
          Unload SocketTCP(Index)
          Label1.Caption = ""Puertos Conectados: "" & Format(SocketTCP.Count - 1)
      End Sub
      Private Sub SocketTCP_ConnectionRequest(Index As Integer, ByVal requestID As Long)
          LstTCP.AddItem Format(requestID) & "" solicita conexión""
          If SocketTCP(Index).State  sckClosed Then SocketTCP(Index).Close
          SocketTCP(Index).Accept requestID
          LstTCP.AddItem ""SocketTCP("" & Format(Index) & "")_Connect""
      End Sub
      Private Sub SocketTCP_DataArrival(Index As Integer, ByVal bytesTotal As Long)
          ' Gestiona la recepción de datos
          Dim LineaDatos As String, Comando As String, Parametros As String
          ' Se carga el array
          SocketTCP(Index).GetData LineaDatos, vbString
          LstTCP.AddItem "">"" & LineaDatos & "" · "" & SocketUDP.RemoteHostIP
          Comando = UCase$(Left$(LineaDatos, 7))
          If Len(LineaDatos) > 7 Then Parametros = Mid$(LineaDatos, 8)
          ' Se comprueba la orden
          Select Case Comando
          Case ""SERDATE""
              ' Se envia la fecha al cliente
              EnviarTCP = Format(Index) & ""·Date!!!"" & Format(Now, ""dd/mm/yyyy hh:nn:ss"")
          Case Else
              ' Si se recibe algo no esperado
              LstTCP.AddItem ""Orden Desconocida...""
          End Select
      End Sub
      Private Sub SocketUDP_DataArrival(ByVal bytesTotal As Long)
          Dim LineaDatos As String, Comando As String, Parametros As String
          ' Se carga el Array
          SocketUDP.GetData LineaDatos, vbString
          LstUDP.AddItem "">"" & LineaDatos & "" · "" & SocketUDP.RemoteHostIP
          Comando = UCase$(Left$(LineaDatos, 7))
          If Len(LineaDatos) > 7 Then Parametros = Mid$(LineaDatos, 8)
          ' Se comprueba la orden
          Select Case Comando
          Case ""SERVER?""
              ' Se crea un control TCP para que se conecte el cliente
              Load SocketTCP(SocketTCP.Ubound + 1)
              SocketTCP(SocketTCP.Ubound).LocalPort = 0
              SocketTCP(SocketTCP.Ubound).Listen
              ' Se envian los datos al cliente
              EnviarUDP = SocketUDP.RemoteHostIP & ""·Server#"" & SocketUDP.LocalIP & "":"" & SocketTCP(SocketTCP.Ubound).LocalPort
              LstUDP.AddItem EnviarUDP
              Label1.Caption = ""Puertos Conectados: "" & Format(SocketTCP.Count - 1)
          Case Else
              ' Si se recibe algo no esperado
              LstUDP.AddItem ""Orden Desconocida...""
          End Select
      End Sub

      Aquí tienes el código completo

      Anuncios

      Responder

      Introduce tus datos o haz clic en un icono para iniciar sesión:

      Logo de WordPress.com

      Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

      Google photo

      Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

      Imagen de Twitter

      Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

      Foto de Facebook

      Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

      Conectando a %s