¿Cómo puedo asignar un socket local Unix a una toma de inet?
-
23-08-2019 - |
Pregunta
Estoy ansioso por ver si es posible asignar un socket UNIX a una toma de INET. La situación es simplemente que me gustaría conectar a un servidor MySQL. Desafortunadamente se ha sockets INET desactivado y por lo tanto sólo se puede conectar con conectores Unix. Las herramientas que estoy utilizando / escritura tienen que conectarse a una toma de INET, así que estoy tratando de ver si puedo asignar una a la otra.
Se tomó una buena cantidad de buscar pero encontré socat , que supuestamente hace lo que estoy buscando. Me preguntaba si alguien tiene alguna sugerencia sobre cómo lograr esto. La línea de comandos He estado usando (con un éxito parcial) es:
socat -v UNIX-CONNECT:/var/lib/mysql/mysql.sock TCP-LISTEN:6666,reuseaddr
Ahora puedo hacer conexiones y hablar con el servidor. Por desgracia, cualquier intento de hacer múltiples conexiones fallan, ya que necesito para usar la opción tenedor pero esta opción parece hacer que las conexiones no funcional.
Sé que puedo abordar el problema con Perl (mi idioma preferido), pero prefiero evitar escribir toda la aplicación a mí mismo. Me familiarizados con las bibliotecas IO :: Socket, simplemente estoy esperando que alguien tiene experiencia haciendo este tipo de cosas. Abierto a sugerencias / ideas.
Gracias.
Solución
Invertir el orden de los argumentos a socat
, y funciona.
socat -v tcp-l:6666,reuseaddr,fork unix:/var/lib/mysql/mysql.sock
Esto indica socat
a
- escuchar en el puerto TCP 6666 (con
SO_REUSEADDR
) - Espera para aceptar una conexión
- Cuando se establece una conexión, tenedor. En el niño, seguir los siguientes pasos. En los padres, ir a 2.
- Abrir una conexión de dominio UNIX a la toma de
/var/lib/mysql/mysql.sock
. - Transferencia de datos entre los dos puntos finales, a continuación, de salida.
La escritura es a la inversa
socat -v unix:/var/lib/mysql/mysql.sock tcp-l:6666,reuseaddr,fork
no funciona, porque esto da instrucciones a socat
- Abrir una conexión de dominio UNIX a la toma de
/var/lib/mysql/mysql.sock
. - escuchar en el puerto TCP 6666 (con
SO_REUSEADDR
) - Espera para aceptar una conexión
- Cuando se establece una conexión, desovar un niño trabajador para transferir datos entre las dos direcciones.
- El padre continúa aceptar conexiones en la segunda dirección, pero ya no tiene la primera dirección disponible: se le dio al primer niño. Así que nada útil se puede hacer a partir de ahora.
Otros consejos
Sí, usted puede hacer esto en Perl.
perlipc , IO :: Seleccione , IO :: Socket y de Beej Guía de Programación de Red .
Es posible que desee considerar hacerlo en el POE -. Es biblioteca asíncrona para hacer frente a eventos, así que parece grande para la tarea
No es 100% relevante, pero lo uso POE escribir proxy entre protocolo sin estado (HTTP) y el protocolo con estado (sesión de telnet, y más específicamente - sesión MUD), y era bastante simple - Puede comprobar el código de aquí: http: / /www.depesz.com/index.php/2009/04/08/learning-poe-http-2-mud-proxy/.
En los comentarios también sugirieron que alguien Coro / AnyEvent - No he jugado con él todavía, pero es posible que desee comprobar
.