Comment gérer des sessions via UDP pour un serveur intermédiaire entre plusieurs clients et un serveur de service? - linux, programmation réseau, udp

J'ai besoin de faire un pont comme la figure suivante. C'est juste un serveur UDP qui reçoit les paquets des clients, les transmet à un autre serveur. Le scénario sera bien compris par la figure.

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

Voici la fonction d'envoi et de réception de donnéessont écrits le long du côté de l'appareil. Les processus de communication sont identifiés par les numéros 1, 2, 3 et 4, sous les flèches. J'ai essayé de dessiner la figure de telle manière qu'elle puisse représenter une chronologie: de haut en bas.

Maintenant, venez au point.Lorsque je n'ai qu'un seul client à gérer, il est assez facile de le faire. Mais supposons que le numéro de client peut être multiple. Supposons que les clients sont des téléphones connectés à Internet à l'aide d'un numéroteur et que le serveur est un serveur SIP exécutant Asterisk / Freeswitch ou quelque chose comme ça. Dans un tel scénario, de nombreux clients peuvent être présents. Je ne veux pas utiliser le serveur passerelle comme serveur proxy (exécutant kamailio et rtpproxy) pour que la communication puisse être efficace.

Asterisk ou un serveur SIP peut gérer des sessions udpJe connais. Mais comment peut le pont. Comme udp ne maintient aucune session, comment puis-je compléter la quatrième étape. Comment puis-je identifier la réponse du serveur de service pour un client? Quel type de logiciel (bien sûr léger pour l'efficacité, et j'ai moi-même besoin de l'écrire) devrait être écrit pour gérer les sessions. Si quelqu'un peut me donner une idée de la gestion de session via udp, cela me sera très utile. J'ai beaucoup cherché mais je n'ai trouvé aucune réponse appropriée.

Merci d'avance.

Réponses:

1 pour la réponse № 1

Voici un algorithme que j'ai utilisé sur une implémentation de proxy générique pour le trafic TCP / UDP:

Modules de programme:

Un créateur de connexion et plusieurs employés de proxy

Ils sont implémentés en tant que threads autonomes.

Couler:

Le module Créateur est responsable d'accepter etgérer de nouvelles connexions. Il informe et transmet les données initiales à un worker qui traitera à partir de ce point sur toutes les E / S pour cette connexion, en parallèle il ouvrira une connexion de l'autre côté (peut être fait aussi dans le worker).

Le travailleur aura une connexion et sera responsable pendant son cycle de vie.

Quelques points techniques:

Une connexion UDP est déterminée par IP et PORT (SRC et DEST).

Le créateur peut attendre des messages de toutes les sources, alors que le travailleur peut attendre des messages provenant d'une source spécifique (en liant le socket UDP).

Pour la performance, les travailleurs devraient correspondre au nombre decœurs un système a et permettre à chacun de gérer les sockets async. De plus, si un travailleur manipule plusieurs sockets, un algorithme doit être placé pour équilibrer la charge entre les travailleurs lorsque le créateur / patron distribue de nouvelles connexions.


Menu