¿Cómo administrar sesiones a través de UDP para un servidor puente intermedio entre múltiples clientes y un servidor de servicio? - Linux, programación de red, udp

Necesito hacer un puente como la siguiente figura. Es solo un servidor UDP que recibe paquetes de clientes y lo reenvía a otro servidor. El escenario será bien entendido por la figura.

+--------+sendto()  recvfrom()+-----------+
| client |------------------->|           |                         +-------------+
|        |        1           | bridge    |sendto()      recvfrom() |             |
|        |                    |           |------------------------>|    duty     |
|        |                    |           |           2             |   server    |
|        |                    |           |recvfrom()      sendto() | processing  |
|        |                    |           |<------------------------|             |
|        |recvfrom()  sendto()|           |            3            |             |
|        |<-------------------|           |                         +-------------+
+--------+         4          +-----------+

Aquí la función para enviar y recibir datosestán escritos a lo largo del costado del dispositivo. Los procesos de comunicación se identifican con los números 1, 2, 3 y 4, bajo los signos de flecha. Traté de dibujar la figura de tal manera que pueda representar una línea de tiempo: de arriba a abajo.

Ahora ven al punto.Cuando solo tengo un cliente para administrar, es una tarea bastante fácil hacerlo. Pero supongamos que el número de cliente puede ser muchos. Supongamos que los clientes son teléfonos conectados a Internet usando un marcador y el servidor es un servidor SIP que ejecuta Asterisk / Freeswitch o algo así. En tal escenario, muchos clientes pueden estar presentes. No quiero usar el servidor de bridge como un servidor proxy (ejecutando kamailio y rtpproxy) para que la comunicación sea eficiente.

Asterisk o un servidor SIP puede administrar sesiones udpLo sé. Pero como puede el puente. Como udp no mantiene sesiones, ¿cómo puedo completar el cuarto paso? ¿Cómo puedo identificar la respuesta del servidor de servicio para un cliente? ¿Qué tipo de software (por supuesto, ligero para la eficiencia, y yo mismo tengo que escribirlo) debe escribirse para el manejo de las sesiones. Si alguien me puede dar una idea de la gestión de sesiones a través de udp, será muy útil para mí. Busqué mucho pero no encontré ninguna respuesta adecuada.

Gracias por adelantado.

Respuestas

1 para la respuesta № 1

Aquí hay un algoritmo que utilicé en una implementación Proxy genérica para tráfico TCP / UDP:

Módulos de programa:

Creador de una conexión y trabajadores de múltiples apoderados

Se implementan como hilos independientes.

Fluir:

El módulo Creador es responsable de aceptar ymanejar nuevas conexiones. Informa y pasa los datos iniciales a un trabajador que manejará desde ese punto en todas las E / S de esa conexión, en paralelo abrirá una conexión con el otro lado (también se puede hacer en el trabajador).

El trabajador obtendrá una conexión y será responsable de ello durante su ciclo de vida.

Algunos puntos técnicos:

Una conexión UDP está determinada por IP y PUERTO (SRC y DEST).

El creador puede esperar mensajes de todas las fuentes, mientras que el trabajador puede esperar mensajes de una fuente específica (vinculando el socket UDP).

Para el rendimiento, los trabajadores deben ajustarse al número denúcleos que tiene un sistema y permiten que cada uno maneje conectores asíncronos. Además, si un trabajador maneja varios sockets, se debe colocar un algoritmo para equilibrar la carga entre los trabajadores cuando el Creador / Jefe distribuye las conexiones nuevas.


Menú