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.
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
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
Posted
dom, may 7 2000 19:59
by
Maverick