En C en Linux, ¿cómo haría para usar 2 programas, el último enviando datos de texto al primero que se muestra usando stdout?
-
28-10-2019 - |
Pregunta
Estoy escribiendo un sencillo Mensajería instantánea programa en C en Linux.
Ahora mismo tengo un programa que une un zócalo a un puerto en la máquina local, y escucha el texto datos enviados por otro programa que se conectó a la IP y al puerto de mi máquina local.
Bueno, puedo hacer que este cliente envíe datos de texto a mi programa y que se muestren usando stdout
en mi máquina local;Sin embargo, yo No se puede programar una forma de enviar datos a la máquina cliente., porque mi programa está ocupado escuchando y mostrando el texto enviado por la máquina cliente.
¿Cómo haría para crear un nuevo proceso (que escuche y muestre el texto que le envía la máquina cliente, luego tome ese texto y lo envíe al otro programa? stdout
, mientras que el otro programa se encarga de stdin
siendo enviado a la máquina cliente) o crear 2 programas que realicen trabajos separados (enviar, recibir y mostrar) y se envíen los datos apropiados entre sí?
Lo siento si está redactado de forma extraña y lo aclararé si es necesario.miré dentro exec
, execve
, fork
, etc.pero no sé si este es el camino apropiado a seguir o si hay una forma más sencilla que me falta.
Cualquier ayuda será enormemente apreciada, gracias.
EDITAR:En retrospectiva, pensé que esto sería mucho más fácil de lograr con 2 programas separados.Uno, el servidor de mensajería instantánea y los demás, los clientes de mensajería instantánea.
Los clientes de mensajería instantánea se conectarían al programa del servidor de mensajería instantánea y enviarían cualquier texto que quisieran al servidor de mensajería instantánea.Luego, el servidor de mensajería instantánea simplemente registraría los datos que se le envían en un búfer/archivo con los nombres/ip de los clientes adjuntos al texto enviado por cada cliente, y enviaría ese texto (en formato de nombre:texto) a cada cliente que esté conectado.
Esto eliminaría la necesidad de una comunicación complicada entre procesos/programas para stdin
y stdout
, y en cambio, Utilice una forma sencilla de comunicación cliente/servidor., con los programas cliente mostrando el texto enviado desde el servidor a través de stdout
, y usando stdin
para enviar cualquier texto al servidor.
Dicho esto, todavía estoy interesado en que alguien responda mi pregunta original:para la ciencia.Gracias a todos por leer y espero que alguien se beneficie de mi lluvia de ideas mental o de cualquier respuesta que surja de la comunidad.
Solución
Sin embargo, no puedo programar una forma de enviar datos a la máquina del cliente, porque mi programa está ocupado escuchando y mostrando el texto enviado por la máquina del cliente.
El mismo zócalo que fue devuelto de un choque de audición por accept()
Se puede usar tanto para enviar y recibir datos. Por lo tanto, su enchufe nunca está "ocupado" solo porque está leyendo de él ... puede volver a escribir en el mismo zócalo.
Si necesita leer y escribir simultáneamente, comparta el enchufe devuelto de accept()
en dos hilos diferentes. Dado que la pila de redes está utilizando dos búferes diferentes para enviar y recibir en el enchufe, un hilo dedicado para leer y otro hilo dedicado para escribir en el enchufe estará ausente sin el uso de mutexes.
Otros consejos
Iría con Fork (): crear un proceso infantil y ahora tiene dos procesos diferentes que pueden hacer dos cosas diferentes en dos enchufes diferentes: uno puede recibir y el otro puede enviar. Todavía no tengo experiencia personal con la codificación de un cliente/servidor como este, pero esa sería mi primera puñalada para resolver su problema ...
Como @bdonlan mencionó en un comentario, definitivamente necesitas una llamada multiplexada como seleccionar o preferiblemente encuesta (o llamadas al sistema relacionadas como pselect
, ppoll
...).Estas llamadas multiplexadas son la primitiva para esperar en varios canales a la vez (con pselect
y ppoll
capaz de esperar atómicamente eventos y señales de E/S).Lea también el seleccione tutorial página de manual.Por supuesto, puede esperar por varios descriptores de archivos, y puede esperar por las capacidades de lectura y escritura (incluso en el mismo socket, si es necesario), en el mismo select
o poll
llamada al sistema.
Todos los bucles y marcos basados en eventos utilizan estas llamadas de multiplexación (como poll
o select
).También podrías usar liberal, o incluso (particularmente cuando se codifica una aplicación de interfaz gráfica de usuario) algún conjunto de herramientas GUI como Gtk o Qt, que se basan en un bucle de eventos central.
No creo que tener una aplicación multiproceso o multiproceso sea útil en su caso.Sólo necesitas un bucle de eventos.
También puede solicitar obtener un SIGIO
señal cuando llegan datos a su enchufe usando fcntl con F_SETOWN
, pero esto no es muy útil para ti.Entonces, a menudo querrás que tu socket no se bloquee.