Come gestire le sessioni tramite UDP per un server bridge intermedio tra più client e un server duty? - linux, network-programming, udp

Devo fare un ponte come nella figura seguente. È solo un server UDP che riceve pacchetti dai client, li inoltra a un altro server. Lo scenario sarà ben compreso dalla figura.

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

Qui la funzione per inviare e ricevere datisono scritti lungo il lato del dispositivo. I processi di comunicazione sono identificati dai numeri 1,2,3 e 4, sotto le frecce. Ho provato a disegnare la figura in modo tale che possa rappresentare una timeline: dall'alto verso il basso.

Ora vieni al punto.Quando ho solo un client da gestire, è abbastanza facile farlo. Ma supponiamo che il numero del cliente possa essere molti. Supponiamo che i client siano telefoni connessi a Internet utilizzando un dialer e che il server sia un server SIP che esegue Asterisk / Freeswitch o qualcosa del genere. In tale scenario possono essere presenti molti clienti. Non voglio utilizzare il server bridge come server proxy (eseguendo kamailio e rtpproxy) in modo che la comunicazione possa essere efficiente.

Asterisk o un server SIP possono gestire le sessioni udpLo so. Ma come può il ponte. Come udp non mantiene sessioni come posso completare il quarto passo. Come posso identificare la risposta del server di servizio per un cliente? Che tipo di software (ovviamente leggero per l'efficienza, e io stesso ho bisogno di scriverlo) dovrebbe essere scritto per gestire le sessioni. Se qualcuno mi può dare un'idea della gestione delle sessioni tramite udp, sarà molto utile per me. Ho cercato molto ma non ho trovato nessuna risposta adatta.

Grazie in anticipo.

risposte:

1 per risposta № 1

Ecco un algoritmo che ho usato su un'implementazione Proxy generica per il traffico TCP / UDP:

Moduli del programma:

One Connection Creator e Multiple Proxy Workers

Sono implementati come thread autonomi.

Flusso:

Il modulo Creator è responsabile di accettare egestire nuove connessioni. Informa e trasmette i dati iniziali a un lavoratore che gestirà da quel punto su tutti gli I / O per quella connessione, in parallelo aprirà una connessione all'altro lato (può essere eseguita anche nell'operatore).

Il lavoratore otterrà una connessione e ne sarà responsabile durante il suo ciclo di vita.

Alcuni punti tecnici:

Una connessione UDP è determinata da IP e PORT (SRC e DEST).

Il Creatore può attendere i messaggi da tutte le fonti, mentre il lavoratore può attendere i messaggi da una fonte specifica (vincolando il socket UDP).

Per prestazioni, i lavoratori dovrebbero corrispondere al numero dicore che un sistema ha e consente a ciascuno di gestire socket asincroni. Inoltre, se un lavoratore gestisce più socket, è necessario posizionare un algoritmo per bilanciare il carico tra i lavoratori quando il Creator / Boss distribuisce nuove connessioni.


Menu