Wie kann ich einen lokalen Unix-Socket an eine inet-Buchse Karte?
-
23-08-2019 - |
Frage
Ich bin gespannt, ob es möglich ist, eine UNIX-Socket auf einer INET Buchse abzubilden. Die Situation ist einfach, dass ich zu einem MySQL-Server verbinden möchte. Leider hat es INET Steckdosen deaktiviert und deshalb kann ich nur mit UNIX-Buchsen anschließen. Die Werkzeuge, die ich bin mit / Schreiben haben auf einer INET Steckdose zu verbinden, so versuche ich, zu sehen, ob ich einen auf die andere Karte kann.
Es dauerte eine ganze Menge der Suche, aber ich habe finden socat , die vorgeblich tut was ich suche. Ich habe mich gefragt, ob jemand irgendwelche Vorschläge hat, wie dies zu erreichen. Die Befehlszeilen I (mit Teilerfolg) verwendet haben ist:
socat -v UNIX-CONNECT:/var/lib/mysql/mysql.sock TCP-LISTEN:6666,reuseaddr
Jetzt kann ich Verbindungen herstellen und mit dem Server sprechen. Leider scheitern alle Versuche an mehreren Verbindungen herstellen, als ich die Gabel Option verwenden müssen, aber diese Option scheint die Verbindungen nicht funktionsfähig zu machen.
Ich weiß, dass ich mit Perl das Problem angehen kann (meine bevorzugte Sprache), aber ich würde lieber vermeiden, dass die gesamte Implementierung Schreiben selbst. Ich vertraut mit den IO :: Socket-Bibliotheken, habe ich einfach bin der Hoffnung, jemand Erfahrung macht diese Art der Sache hat. Offen für Vorschläge / Ideen.
Danke.
Lösung
Kehrt die Reihenfolge der Argumente socat
, und es funktioniert.
socat -v tcp-l:6666,reuseaddr,fork unix:/var/lib/mysql/mysql.sock
Das weist socat
zu
- Hören Sie auf TCP-Port 6666 (mit
SO_REUSEADDR
) - Warten Sie eine Verbindung akzeptieren
- Wenn eine Verbindung hergestellt wird, Gabel. In dem Kind weiterhin die folgenden Schritte aus. In der übergeordneten, gehen Sie zu 2.
- Öffnen Sie eine UNIX-Domain-Verbindung zum
/var/lib/mysql/mysql.sock
Buchse. - Übertragen von Daten zwischen den beiden Endpunkten, dann beenden.
Das Schreiben es andersrum
socat -v unix:/var/lib/mysql/mysql.sock tcp-l:6666,reuseaddr,fork
funktioniert nicht, weil dies anweist socat
zu
- Öffnen Sie eine UNIX-Domain-Verbindung zum
/var/lib/mysql/mysql.sock
Buchse. - Hören Sie auf TCP-Port 6666 (mit
SO_REUSEADDR
) - Warten Sie eine Verbindung akzeptieren
- Wenn eine Verbindung hergestellt ist, laichen einen Arbeiter Kind von Daten zwischen den beiden Adressen zu übertragen.
- Die Eltern weiterhin Verbindungen auf der zweiten Adresse zu akzeptieren, aber nicht mehr die erste Adresse zur Verfügung: es wurde das erste Kind gegeben. Also nichts brauchbares kann ab diesem Zeitpunkt erfolgen.
Andere Tipps
Ja, können Sie dies in Perl tun.
Lesen Sie perlipc , IO :: wählen, Beej Guide to Network Programming .
Vielleicht möchten Sie tun es in POE betrachten -. Es ist asynchrone Bibliothek für mit Ereignissen zu tun, so sieht es aus wie groß für die Aufgabe
Es ist nicht 100% relevant, aber ich benutze POE-Proxy zwischen zustandsloses Protokoll (HTTP) und zustandsbehaftete Protokoll (Telnet-Sitzung, und insbesondere - MUD-Sitzung) zu schreiben, und es war ziemlich einfach - Sie können den Code überprüfen in hier: http: / /www.depesz.com/index.php/2009/04/08/learning-poe-http-2-mud-proxy/ .
In der Kommentare jemand auch vorgeschlagen, Coro / AnyEvent - Ich habe nicht mit ihm noch gespielt, aber man könnte es überprüfen möchten
.