Come posso mappare un socket unix locale per una presa inet?
-
23-08-2019 - |
Domanda
Sono curioso di sapere se è possibile mappare un socket UNIX a una presa INET. La situazione è semplicemente che mi piacerebbe di connettersi a un server MySQL. Purtroppo è socket INET disattivato e quindi mi può connettersi solo con socket UNIX. Gli strumenti che sto usando / scrittura devono connettersi a una presa INET, quindi sto cercando di vedere se riesco a mappare uno verso l'altro.
Ci sono voluti una discreta quantità di ricerca ma ho trovato socat , che fa presumibilmente quello che sto cercando. Mi chiedevo se qualcuno ha qualche suggerimento su come raggiungere questo obiettivo. La riga di comando che ho usato (con successo parziale) è:
socat -v UNIX-CONNECT:/var/lib/mysql/mysql.sock TCP-LISTEN:6666,reuseaddr
Ora posso creare dei legami e comunicare con il server. Purtroppo ogni tentativo di effettuare connessioni multiple non riescono come ho bisogno di utilizzare l'opzione della forcella ma questa opzione sembra rendere i collegamenti non funzionali.
So di poter affrontare il problema con il Perl (la mia lingua preferita), ma preferirei evitare di scrivere l'intera implementazione me stesso. Ho familiarità con le librerie :: IO Socket, sto semplicemente sperando qualcuno ha esperienza di fare questo genere di cose. Aperto ai suggerimenti / idee.
Grazie.
Soluzione
Invertire l'ordine dei vostri argomenti per socat
, e funziona.
socat -v tcp-l:6666,reuseaddr,fork unix:/var/lib/mysql/mysql.sock
Ciò indica socat
a
- ascolto sulla porta TCP 6666 (con
SO_REUSEADDR
) - L'ora di accettare una connessione
- Quando viene effettuata una connessione, forchetta. Nel bambino, continuare la procedura riportata di seguito. Nel genitore, andare a 2.
- Aprire una connessione dominio UNIX alla presa
/var/lib/mysql/mysql.sock
. - Trasferire i dati tra i due punti finali, quindi uscire.
Scriverlo il contrario
socat -v unix:/var/lib/mysql/mysql.sock tcp-l:6666,reuseaddr,fork
non funziona, perché questo indica socat
a
- Aprire una connessione dominio UNIX alla presa
/var/lib/mysql/mysql.sock
. - ascolto sulla porta TCP 6666 (con
SO_REUSEADDR
) - L'ora di accettare una connessione
- Quando viene effettuata una connessione, deporre le uova un bambino lavoratore di trasferire i dati tra i due indirizzi.
- Il genitore continua ad accettare le connessioni al secondo indirizzo, ma non ha più il primo indirizzo disponibile: è stato dato per il primo figlio. Quindi nulla di utile può essere fatto da questo punto in poi.
Altri suggerimenti
Sì, è possibile farlo in Perl.
perlipc , IO :: Selezionare , IO :: Socket e di Beej Guida alla rete di programmazione .
Si potrebbe prendere in considerazione di farlo in POE -. È biblioteca asincrona per trattare con gli eventi, così sembra grande per l'operazione
Non è rilevante al 100%, ma io uso POE scrivere proxy tra protocollo stateless (HTTP) e il protocollo statefull (sessione telnet, e più specificamente - sessione di MUD), ed era piuttosto semplice - È possibile controllare il codice in qui: http: / /www.depesz.com/index.php/2009/04/08/learning-poe-http-2-mud-proxy/.
Nel commenti qualcuno ha suggerito anche Coro / AnyEvent - Non ho giocato con esso ancora, ma si potrebbe desiderare di controllare
.