2012-10-22 9 views
5

Ho un sistema in cui voglio ascoltare un socket e attendere il collegamento del client e quindi passare la connessione a un'altra applicazione che verrà avviata non appena viene stabilita la connessione.Socket di routing su un'altra porta

Non ho il controllo su quest'altra applicazione e posso solo impostare la porta su cui ascolterà, ma voglio avere un processo per ogni nuovo client.

questo è quello che sto cercando di fare:

routing

ho cercato una soluzione, ma io cosa non ho la terminologia giusta, ma sono riuscito a trovare su "Unix Network Programming" di Richard Stevens sulla famiglia di prese AF_ROUTE che può essere combinato con un SOCK_RAW per instradare una connessione a un altro IP e porta. Ma c'è troppo poca documentazione su how to use this flag e sembra richiedere i privilegi di superutente (che voglio evitare).

Forse c'è una soluzione più semplice ma probabilmente sto usando i termini sbagliati. È chiaro cosa voglio fare?

+0

le app e le porte mappatura 1: 1? se sì, perché non possono ascoltare se stessi? – SparKot

+0

@SparKot Non esattamente. Per ogni nuovo cliente, deve essere aperta una nuova "APP" – JBernardo

+0

Puoi convincere l'altra applicazione a leggere da un altro descrittore di file (ad esempio stdin)? Se è così, allora si potrebbe semplicemente "dup2" il socket fd su stdin e fork + eseguire l'altra applicazione. –

risposta

0

Non penso che sarete in grado di "passare" semplicemente la presa come volete, specialmente se non potete cambiare e ricompilare "APP". I socket includono vari overhead amministrativi (gestione delle risorse, ecc.) Collegati al processo di cui sono proprietari. Inoltre, se non riesci a ricompilare APP, non c'è modo di farlo bypassare i passaggi necessari per accettare una connessione e semplicemente avere una connessione già aperta "connessa" con il tuo router.

Tuttavia, hai considerato semplicemente l'utilizzo del router come pass-through? Fondamentalmente, il tuo processo "Router" si connette tramite socket a ogni processo "APP" che genera, e semplicemente riecheggia qualsiasi cosa riceve dal client appropriato all'app appropriata, e viceversa per APP al client?

Questo aggiunge un sovraccarico e dovrai gestire una piccola mappatura per tenere traccia di quali client vanno a quali app, ma potrebbe funzionare (supponendo che l'APP o il client non stiano basando alcun comportamento sull'indirizzo IP) sono connessi a, ecc.). Supponendo che non è possibile ricompilare APP, potrebbero non esserci troppe opzioni.

Il codice per questo è relativamente semplice. Il gestore per i dati ricevuti da APP cerca solo il socket per l'app appropriata dalla tua mappatura, quindi esegue una trasmissione non bloccante di questi dati su di essa. Allo stesso modo il gestore per i dati ricevuti dal cliente. A seconda di come si comportano esattamente i client e l'app, potrebbe essere necessario gestire un po 'di sincronizzazione (se si riceve da entrambi contemporaneamente).

+0

Non volevo realmente leggere e scrivere sul socket per comunicare entrambe le estremità. Quello che probabilmente si potrebbe fare è leggere "APP" da questo descrittore di file. – JBernardo

+0

hrm, forse dovresti modificare la domanda per chiarire cosa può o non può fare l'APP? il modo in cui ho letto "Non ho il controllo su questa altra applicazione e posso solo impostare la porta dove ascolterà" mi ha fatto capire che doveva leggere un socket e non c'erano altre opzioni.se APP ha altre opzioni di I/O come stdin/out o forse qualche altro parametro della riga di comando che puoi giocare con esso potrebbe aiutare i rispondenti a fornire suggerimenti :) – davec

+0

Non pensavo di poterlo fare, ma il commento di Adam Rosenfield sopra può essere un'opzione. Ci sto provando ora, ma non so se funzionerà – JBernardo