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.

War es hilfreich?

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

  1. Hören Sie auf TCP-Port 6666 (mit SO_REUSEADDR)
  2. Warten Sie eine Verbindung
  3. akzeptieren
  4. Wenn eine Verbindung hergestellt wird, Gabel. In dem Kind weiterhin die folgenden Schritte aus. In der übergeordneten, gehen Sie zu 2.
  5. Öffnen Sie eine UNIX-Domain-Verbindung zum /var/lib/mysql/mysql.sock Buchse.
  6. Ü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

  1. Öffnen Sie eine UNIX-Domain-Verbindung zum /var/lib/mysql/mysql.sock Buchse.
  2. Hören Sie auf TCP-Port 6666 (mit SO_REUSEADDR)
  3. Warten Sie eine Verbindung
  4. akzeptieren
  5. Wenn eine Verbindung hergestellt ist, laichen einen Arbeiter Kind von Daten zwischen den beiden Adressen zu übertragen.
  6. 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

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top