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?

StackOverflow https://stackoverflow.com/questions/8867421

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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top