Pregunta

La red lib estoy escribiendo necesidades para enviar y recibir mensajes a través de un socket TCP. Los mensajes pueden ser enviados o recibidos en cualquier momento, es decir debería funcionar como un canal dúplex completo.

I fue capaz de poner en práctica tal escenario usando dos hilos:. Hilo principal llamando a send () y un hilo dedicado sobre todo bloqueado en recv () llamada

Mi pregunta es: ¿es posible aplicar el mismo escenario con un único hilo? Es decir. mediante el registro de una función de devolución de llamada?

Como nota al margen:. Me necesita implementar este escenario en C ++, Java y Python

¿Fue útil?

Solución

Sí, es posible. Es necesario utilizar una API que permite multiplexado I / O. En C / C ++ y Python puede utilizar Select () y sin bloqueo de E / S, por lo que la llamada de red sólo alguna vez bloque en selecciono es (). También hay poll () y epoll () y un número de otras APIs similares que realizan la misma cosa, con diferentes grados de eficiencia y portabilidad. Java ha sin bloqueo de E / S API también.

Otra posibilidad es el uso de E / S asíncrona, donde le dice al sistema operativo para iniciar una operación de E / S y se le notifica (por algún mecanismo) cuando se ha terminado la operación. No estoy familiarizado con ese estilo de programación de la red, sin embargo, por lo que no voy a tratar de dar más detalles.

Otros consejos

En general, una biblioteca sería hacer esto proporcionando una interfaz en bucle principal de bucle / evento de la aplicación.

Por ejemplo, las aplicaciones de la red usando más de un solo roscados tendría un bucle principal que bloquea en select(), poll() o similar. Su biblioteca acaba de regresar de un descriptor de archivo que la aplicación debe incluir en su convocatoria select() / poll(), y una función de devolución de llamada que la aplicación debe llamar al descriptor de archivo que se puede leer.

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