FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#21
|
||||
|
||||
Cita:
Cita:
¿Entoneces es posible utilizar UDP aunque haya varias instancias RDP ?
__________________
Gracias de antemano por vuestra ayuda. ·.:*:.·Yako·.:*:.· |
#22
|
||||
|
||||
Es posible tener varios servidores escuchando en la misma máquina por el mismo puerto, no es una situación común pero no es un imposible. Para esto está el Multicast.
Te pongo un ejemplo de servidor socket multicast en un thread para poder compaginarlo con una app de ventanas:
Este servidor se pone a la escucha en el puerto 9090 y podemos tener varios en ejecución. Ahora el cliente debe enviar mensajes UDP al Broadcast por el puerto 9090, para ello debemos calcular esa dirección. Te pongo un ejemplo de cliente que envía un mensaje a todos los servidores a la vez, estén o no en la misma máquina:
Probado en Win10 y compilado con Delphi 7 Espero que resuelva tu duda y en general la duda que originó ente hilo. Saludos. |
#23
|
||||
|
||||
Muchas, pero muchas, gracias a migo escafandra... pero esto es muy elevado para mi entendimiento
Primero, porque creo yo tengo un error de concepto: -En este caso, existe un pequeño ejecutable que monitorea un proceso. Llamemos a este "2do.exe" -Luego está la aplicacion principal, que cada usurario levanta mediante una conexion RDP (Windows). Llamemos "1ro.exe". O sea, hay varios "1ro.exe" y un solo "2do.exe" Entonces, el programa monitor (2do.exe) cada vez que realiza una operación, debería enviar a modo de mensaje de texto, ese resultado a cada instancia del programa (1ro.exe) y este, cuando lo reciba, lo mostrará en pantalla o como se prefiera. Yo pensaba que el monitor debería ser el Servidor y las otras aplicaciones los clientes, pero parece que es a la inversa, no? Segundo, observo que utilizas la unidad WinSock. ¿Es una unidad estandar de Delphi o solo si adquieres el paquete Indy de las versiones Archictect/Professional? Tercero: he instalado por sugerencia de varios, unos componentes "free" denominados Overbyte ICS que tienen infinidad de componentes de conexion TCP/UDP entre ellos: > OverbyteIcsWSocket.pas Winsock component - TCP, UDP, DNS,... > OverbyteIcsWSocketE.pas Register procedure and property editor for TWSocket > OverbyteIcsWSocketS.pas Winsock component for building servers > OverbyteIcsWSocketTS.pas Winsock component for building multithreaded servers > OverbyteIcsDnsQuery DNS lookup component - useful for getting MX records ...que aun no se ni cómo utilizarlos. ¿Supones que podría reemplazar los WinSocks por ellos o no es conveniente?
__________________
Gracias de antemano por vuestra ayuda. ·.:*:.·Yako·.:*:.· |
#24
|
||||
|
||||
Cita:
Cita:
Cita:
Ignoro como quieres que 1ro.exe trabaje con los mensajes recibidos, por eso en el ejemplo puse un MessageBox. Ten en cuenta que todo el código servidor está en un Thread, lo que significa que no puedes usar a las bravas la VCL desde él. Para sincronizar el hilo con el formulario debes usar el método Synchronize o mejor aún en este caso, mensajes Windows desde el hilo a la ventana del formulario que elijas, para ello basta con que al crear el hilo le pases el Handle de dicha ventana y uses SendMessage desde el hilo, cuando recibas un mensaje UDP (que viene de Monitor.exe). En tu formulario generas una función de tratamiento de esos mensajes personalizados y funcionará como un evento. Saludos. Última edición por escafandra fecha: 13-04-2017 a las 18:33:59. |
#25
|
||||
|
||||
A modo de ilustración, te muestro el servidor modificado para disparar un evento al recibir un mensaje desde el cliente. En este caso, el formulario incorpora un TLabel donse se escribirá el mensaje de texto recibido. Uso un mensaje de Windows pero también podrías modificarlo para usar Synchronize.
Saludos Última edición por escafandra fecha: 13-04-2017 a las 18:52:02. |
#26
|
||||
|
||||
Cita:
Ya generé ambos ejemplos, el cliente y el server, pero no pasa nada... Inicio primero el Server y luego el cliente, hago clic en el Button1 y nada.... Inicio primero el Cliente y luego el Server, hago clic en el Button1 y nada.... Mi LAN es 192.168.14.xxx y la funcion GetBrodcastAddress; está devolviendo correctamente 192.168.14.255 Probé otros Port y nada... que puede ser ?
__________________
Gracias de antemano por vuestra ayuda. ·.:*:.·Yako·.:*:.· |
#27
|
||||
|
||||
Posiblemente dependa de la versión del delphi que uses.
La versión Cliente que he probado con delphi7 y Berlin es esta:
Ten en cuenta que el UNICODE juega malas pasadas. Subo un proyecto con fuentes y ejecutables compilados. Última edición por escafandra fecha: 13-04-2017 a las 20:13:11. |
#28
|
|||
|
|||
Excelente aporte Escafandra!!!
|
#29
|
|||
|
|||
Escafandra, te hago el siguiente planteo que difiere del expuesto hasta ahora.
Yo tengo actualmente un programa que actúa como servidor usando TServerSocket en modo nonblocking que envía cada 2 segundos registros con el método SendBuf a cada uno de los clientes (TClientSocket) que se hayan conectado. El tamaño de cada paquete comprimido puede ser algo mas de 8k. Como suelen ser varias pc's clientes, esto genera bastante trabajo del lado servidor que ademas tiene que ir recolectando y haciendo muchos calculos, luego volcar la información a sus respectivos registros, comprimirlos y luego enviar a cada cliente. Si esto quisiera hacerlo con UDP, como debería ser ya que de este modo haría un solo envío? Gracias. |
#30
|
||||
|
||||
Cita:
2. Si quieres hacer un solo envío de un paquete vía Broadcast, debes hacerlo como en el ejemplo que público. Un sólo envio a la dirección Broadcast previamente calculada desde el servidor. El ejemplo permite varios servidores y varios clientes sin cambiar el código, pero si quieres que los servidores envíen puedes establecer un bucle de comunicación o simplemente implementar el procedimiento SendUDP en cada uno. Esto requiere que cada cliente tenga un rhread a la 3scucha, es decir, también son servidores. Si las maquinas van a ser distintas no es preciso usar SO_REUSEADDR. Ten en cuenta que todas las app pueden ser clientes y servidores a un tiempo si quieres y que en UDP no precisas una conexión previa lo que es bueno por una parte pero no asegura que el paquete sea recibido. Saludos |
#31
|
|||
|
|||
Y como se puede lidiar con paquetes que no llegan o cuando se fragmenta en mas de uno?
|
#32
|
||||
|
||||
Cita:
Saludos. |
#33
|
|||
|
|||
Ok, entonces veo que es preferible seguir como hasta ahora con TCP.
|
#34
|
|||
|
|||
Como sería esto mismo pero que el servidor envíe mensajes udp a clientes en distintas pc´s?
|
#35
|
||||
|
||||
El esquema del ejemplo funciona con cualquier máquina en la Red con el mismo código. Un cliente que envía mensajes a servidores en red a través de la dirección BroadCast.
Saludos. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Dos instancias de SQL Server parecen ser la misma | Faust | MS SQL Server | 2 | 22-10-2011 00:13:07 |
¿Cómo usar mutex e impedir dos instancias de la misma app? | Blaster | OOP | 1 | 11-08-2008 05:05:29 |
Cuantas instancias de nuestro exe están corriendo | seoane | Trucos | 3 | 06-03-2007 02:58:41 |
Compartir "objetos" entre varias instancias | mafebresv | Varios | 4 | 17-01-2006 00:38:23 |
Como evitar 2 instancias de una misma ventana hija | edgusano | .NET | 5 | 12-12-2005 17:40:40 |
|