Question

Je suis curieux de savoir s'il est possible de mapper une prise UNIX sur une prise INET. La situation est tout simplement que je voudrais vous connecter à un serveur MySQL. Malheureusement, il a prises INET désactivé et donc je ne peut se connecter avec les sockets UNIX. Les outils que je utilise / écriture doivent se connecter sur une prise INET, donc je suis en train de voir si je peux mapper un à l'autre.

Il a fallu une bonne quantité de la recherche, mais je l'ai trouver socat , qui fait supposément ce que je cherche. Je me demandais si quelqu'un a des suggestions sur la façon d'y parvenir. La ligne de commande que je l'ai utilisé (avec succès partiel) est:

socat -v UNIX-CONNECT:/var/lib/mysql/mysql.sock TCP-LISTEN:6666,reuseaddr

Maintenant, je peux faire des liens et communiquer avec le serveur. Malheureusement, toute tentative de faire des connexions multiples échouent comme je l'ai besoin d'utiliser l'option de fourchette, mais cette option semble rendre les connexions non fonctionnel.

Je sais que je peux aborder la question avec Perl (ma langue préférée), mais je préfère éviter d'écrire toute la mise en œuvre moi-même. Je familiariser avec les IO :: Socket bibliothèques, je suis tout simplement en espérant quelqu'un a l'expérience de faire ce genre de chose. Ouvert aux suggestions / idées.

Merci.

Était-ce utile?

La solution

Inverser l'ordre de vos arguments à socat, et cela fonctionne.

socat -v tcp-l:6666,reuseaddr,fork unix:/var/lib/mysql/mysql.sock

Ceci indique socat à

  1. Écouter sur le port TCP 6666 (avec SO_REUSEADDR)
  2. Attendez d'accepter une connexion
  3. Quand une connexion est établie, la fourchette. Chez l'enfant, poursuivre les étapes ci-dessous. Dans le parent, allez à 2.
  4. Ouvrir une connexion de domaine UNIX à la prise /var/lib/mysql/mysql.sock.
  5. Transfert de données entre les deux extrémités, puis la sortie.

Ecrire l'inverse

socat -v unix:/var/lib/mysql/mysql.sock tcp-l:6666,reuseaddr,fork

ne fonctionne pas, parce que cela indique socat à

  1. Ouvrir une connexion de domaine UNIX à la prise /var/lib/mysql/mysql.sock.
  2. Écouter sur le port TCP 6666 (avec SO_REUSEADDR)
  3. Attendez d'accepter une connexion
  4. Quand une connexion est établie, frayer un enfant de travailleur pour transférer des données entre les deux adresses.
  5. Le parent continue d'accepter les connexions sur la deuxième adresse, mais n'a plus la première adresse disponible: il a été donné au premier enfant. Donc, rien d'utile ne peut être fait à partir de ce moment.

Autres conseils

Oui, vous pouvez le faire en Perl.

Regardez perlipc , IO :: Select , Guide Beej à de programmation réseau.

Vous voudrez peut-être envisager de le faire dans POE -. Sa bibliothèque asynchrone pour faire face aux événements, il ressemble à une grande pour la tâche

Il est pas 100% utile, mais j'utiliser POE écrire proxy entre protocole sans état (HTTP) et le protocole statefull (session telnet, et plus précisément - session de MUD), et il était assez simple - Vous pouvez vérifier le code ici: http: / /www.depesz.com/index.php/2009/04/08/learning-poe-http-2-mud-proxy/.

Dans le commentaire que quelqu'un a également suggéré Coro / AnyEvent - Je ne l'ai pas joué avec elle encore, mais vous pouvez le vérifier

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top