FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Duda sobre WM_COPYDATA y C
Hola amigos, ya me ayudaron una vez para conseguir comunicar dos procesos con builder pero ahora me surge la duda de si eso es posible en C con procesos de consola o si no es posible en C pues c++ de consola.
La misma duda pero con sockets ya que estuve mirando pero nada de lo que veo me compila y da millones de errores y además no entiendo las cosas que hacen. Algún tutorial donde lo explique bien y a ser posible en español me seria muy instructivo. Gracias de antemano. |
#2
|
||||
|
||||
El mensaje WM_COPYDATA sólo es posible recibirlo en app de ventanas, por lo que no funciona en una consola.
Sin embargo puedes hacer una app de ventanas sin usar la VCL de Builder, con su bucle de mensajes capaz de recibir el mensaje WM_COPYDATA y procesarlo. Esta APP puede tener una ventana invisible diseñada sólo para recibir los mensajes WM_COPYDATA. Esto es posible tanto en C como en C++. Otra forma de comunicar dos procesos en con los archivos de memoria compartida, en este caso no hace falta un bucle de mensajes pero si un mecanismo que permita consultar dicha memoria en un bucle. También puedes usar las Atom Tables. Por último tienes la posibilidad de crear un sistema cliente/servidor con sockets a bajo nivel con lo que prescindes de la VCL. En este caso tampoco necesitas un bucle de mensajes Windows pero si un bucle para tratar los sockets. Este último sistema te servirá para comunicar aplicaciones entre el mismo o diferentes PCs Saludos. Última edición por escafandra fecha: 04-03-2017 a las 23:40:03. |
#3
|
||||
|
||||
Para contestar a tu duda sobre WM_COPYDATA en "C" te muestro este ejemplo de una aplicación sin ventana visible que se manda a sí misma un mensaje WM_COPYDATA y lo responde. Está escrita en C
Código PHP:
Saludos. |
#4
|
||||
|
||||
Muy interesante ¿y que hay que cambiar para que la ventana no sea invisible?
Otra cosa, si quisiera enviar el mensaje a otra ventana ¿solo necesito el handle de esa ventana? Me interesa mucho lo que dices de sockets a bajo nivel ¿no tienes ningún texto donde se explique con ejemplos y cosas así? Y sobre lo de la memoria compartida tengo mucha curiosidad de ver como se hace eso porque no tengo ni idea. |
#5
|
||||
|
||||
Cita:
Cita:
Cita:
Cita:
Saludos. Última edición por escafandra fecha: 05-03-2017 a las 12:00:22. |
#6
|
||||
|
||||
Muchas gracias por toda la información. Sobre sockets en Windows encontré esto: http://www.programacionenc.net/index.php?option=com_content&view=article&id=73:sockets-en-windows&catid=37rogramacion-cc&Itemid=55
Tengo algunas dudas sobre el ejemplo que pones de sockets: - Por lo que he leído accept espera a que se conecte un cliente pero, si son por ejemplo 2 clientes ¿como seria? - Si cliente y servidor están en la misma máquina ¿se usaría AF_UNIX? Eso es lo que entendí. - ¿Cómo sería para que fuesen a sincrónicos? |
#7
|
||||
|
||||
Cita:
Cita:
Para establecer al socket como no bloqueante se usa la función ioctlsocket También puedes usar un tipo bloqueante con un TimeOut con la función select Saludos. |
#8
|
||||
|
||||
Ok muchas gracias. Voy a leer y a probar y ya cuento como me fue.
|
#9
|
||||
|
||||
Ando bastante liado con todo esto y por ahora tengo este codigo aunque falta por dejarlo como quiero pero poco a poco:
Código PHP:
Código:
Esperando conexiones entrantes... Error al asociar puerto e ip al socket Conexion entrante desde: 127.0.0.1 Recibiendo Mensajes... Datos recibidos: El proceso con PID: 3748 ha funcionado durante 500 milisegundos. Código PHP:
¿Me pueden explicar porque me falla y que debo cambiar? Última edición por aguml fecha: 06-03-2017 a las 12:10:57. |
#10
|
||||
|
||||
Al final he conseguido que funcione pero quiero aprender a hacer bien las cosas y me gustaria que lo corrigiese alguien y me diga si hago algo mal y me pueda explicar como hacerlo correctamente.
Aquí está el código: Servidor: Código PHP:
Código PHP:
|
#11
|
||||
|
||||
Tu hilo contiene todo el servidor con lo que se repiten y ten en cuenta que no puedes tener dos servidores escuchando por el mismo puerto, el segundo sencillamente falla. El hilo debe crearse tras accept y el parámetro que pasas el el socket que devuelve accept. Cuando la comunicación con ese cliente termine, el hilo debe hacerlo también, con lo que tendrás que detectar un error de lectura recv < 0 y un posible comando de desconexión que diseñas tu mismo y que al cecibirlo desconectas el socket y terminas el hilo saliendo de su bucle.
WaitForMultipleObjects espera a que un hilo o todos terminen. Se utiliza para control. En este caso puedes establecer un número máximo de hilos de ejecución y mantener al servidor esperando antes de crear otra conexión en un nuevo hilo. Saludos. |
#12
|
||||
|
||||
La verdad es que lo único que creo entender es lo que me dices de accept el cual puse dentro del hilo porque pensé que era bloqueante pero si no es así es tan simple como ponerlo en el bucle for antes de llamar al hilo y pasar el valor retornado en vez del que paso ¿no?
Lo demás no entiendo lo que me quieres decir. Si pudieras corregirme el código y poner comentarios en las partes que modifiques explicando el porque lo entendería mejor. |
#13
|
||||
|
||||
Te muestro unos cambios en el servidor y en el cliente. En el server he eliminado el tratamiento de hilos para no enturbiar el código y muestro donde debería haber un bucle para mantenerse activo hasta orden contraria. También muestro como crea un hilo cada vez que acepta un cliente. Efectivamente accept es bloqueante, solo se libera al aceptar un cliente, es por ese motivo por el que no se coloca en el thread.
El server no necesita especificar ninguna dirección, por eso se usa INADDR_ANY. Tambien te muestro una forma más amable de inicializar la dirección tanto en el servidor como en el cliente. Me he tomado la libertad de cambiar algún nombre de variable y de eliminar la estructura parámetro de los hilos, puesto que pasando el Socket de comunicación basta. Código PHP:
Un segundo bucle mantendría la conversación con el hilo que el server nos cree hasta que la finalicemos con algún comando desde el teclado, por ejemplo y enviado al servidor. El server al recibir ese comando saldría del bucle del thread y finalizaría dicho hilo. Código PHP:
Espero que entiendas un poco mejor el tema. Saludos. |
#14
|
||||
|
||||
Ahora si entiendo mejor. En realidad tú código es más de lo que necesito creo yo. Realmente la idea es que un cliente se conecte al servidor y luego obtenga el tiempo inicial y cuando se vaya a salir del proceso calcule el lapso de tiempo transcurrido y lo envie al servidor, no necesita ni enviar más nada ni recibir por lo que el servidor tampoco necesita esperar más nada después de recibir el valor ya que sabe que después de eso el cliente se cerrará. No se si me entiendes, no habrá más comunicación con ese cliente y este se cerrará si o si.
Lo que no veo en tu código del server es como sales del bucle infinito que pusiste para los hilos ya que no veo ningún break. En mi caso tenia que especificar el número de hilos para que WaitForMultipleObjects supiese cuando terminar y tu no lo usas por lo que jamás se saldría a no ser que cierre el programa servidor. Nunca se ejecutaría lo que está después del bucle y no veo la manera de conseguirlo sin hacer lo que yo hice de indicar el número de hilos a WaitForMultipleObjects. |
#15
|
||||
|
||||
Ahora mismo lo tengo asi y sigo teniendo algunas dudas sobre todo en como colocar el bucle del cliente ya que hice algo que creo que no es del todo correcto pero no se seguro. Ademas he colocado un comentario en la zona donde se asignan los parametros para el server en el codigo del cliente que me gustaria que me pudieses solventar.
Aqui el codigo del servidor: Código PHP:
Código PHP:
|
#16
|
||||
|
||||
Para que el cliente no termine si no conecta con el servidor y continúe intentando la conexión, debe contener un bucle y quedaría algo como esto:
Código PHP:
Saludos. |
#17
|
||||
|
||||
me gusta como queda. En cuanto pueda lo pruebo y te cuento pero tiene muy buena pinta. Por otro lado se te olvidó el tema de la duda que comentaba en mi codigo del cliente:
Código PHP:
|
#18
|
||||
|
||||
Cita:
Código PHP:
Saludos. |
#19
|
||||
|
||||
Una duda más. Cuando en el cliente indicó el puerto ¿es el puerto del servidor? ¿y como indicaría cual es el puerto del cliente? O sea me refiero a si es el mismo puerto tanto para cliente como para servidor o no tiene porque ser el mismo para ambos.
|
#20
|
||||
|
||||
El puerto debe ser el mismo para cliente y servidor. Eso no quita para que puedan escribirse app que sean al mismo tiempo clientes y servidores en hilos separados, en ese caso debe haber dos puertos diferentes. Este caso es más típico de protocolo UDP pues no requiere conexión previa.
Saludos. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Reproductor de Musica Uso de WM_COPYDATA | Arieloi2 | API de Windows | 1 | 28-05-2010 03:19:19 |
duda sobre dll | romanuel | C++ Builder | 5 | 26-02-2008 20:58:52 |
Una duda sobre ADO | PTW | Conexión con bases de datos | 1 | 13-04-2004 23:33:14 |
Duda sobre BDE vs IBX | ESA | Firebird e Interbase | 3 | 04-03-2004 17:20:07 |
Duda sobre ADO | Omar Alejandro | Conexión con bases de datos | 7 | 31-05-2003 19:52:58 |
|