2009-05-21 7 views
2

Je suis curieux de savoir s'il est possible de mapper une socket UNIX sur une socket INET. La situation est simplement que je voudrais me connecter à un serveur MySQL. Malheureusement, les prises INET sont désactivées et je ne peux donc me connecter qu'avec des prises UNIX. Les outils que j'utilise/écrivent doivent se connecter sur une socket INET, donc j'essaie de voir si je peux mapper l'un sur l'autre.Comment puis-je mapper un socket unix local à un socket inet?

Il a fallu beaucoup de recherches, mais j'ai trouvé socat, qui fait ce que je cherche. Je me demandais si quelqu'un avait des suggestions sur la façon d'accomplir cela. 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, toutes les tentatives d'établir plusieurs connexions échouent car j'ai besoin d'utiliser l'option fork, mais cette option semble rendre les connexions non fonctionnelles. Je sais que je peux résoudre le problème avec Perl (ma langue préférée), mais je préfère éviter d'écrire toute l'implémentation moi-même. Je suis familier avec les bibliothèques IO :: Socket, j'espère simplement que n'importe qui a l'expérience de faire ce genre de chose. Ouvert aux suggestions/idées.

Merci.

Répondre

6

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

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

Cette commande indique socat à

  1. Ecouter sur le port TCP 6666 (avec SO_REUSEADDR)
  2. Attendez d'accepter une connexion
  3. Lorsqu'une connexion est établie, la fourchette. Chez l'enfant, continuez les étapes ci-dessous. Dans le parent, passez à 2.
  4. Ouvrez une connexion de domaine UNIX à la prise /var/lib/mysql/mysql.sock.
  5. Transférez les données entre les deux extrémités, puis quittez.

il écrit à l'autre autour

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. écoute sur le port TCP 6666 (avec SO_REUSEADDR)
  3. Attendez d'accepter une connexion
  4. Lorsqu'une connexion est établie, frayer un enfant de travailleur pour transférer des données entre les deux adresses.
  5. Le parent continue à 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.
+0

Merci, c'est exactement ce que je cherchais. Incroyable, quelle erreur stupide c'était. – Danny

0

Vous voudrez peut-être envisager de le faire dans POE - c'est une bibliothèque asynchrone pour gérer les événements, ce qui est parfait pour la tâche. Ce n'est pas 100% pertinent, mais j'utilise POE pour écrire le proxy entre le protocole sans état (HTTP) et le protocole statefull (session telnet, et plus précisément - session MUD), et c'était plutôt simple - Vous pouvez vérifier le code ici: http://www.depesz.com/index.php/2009/04/08/learning-poe-http-2-mud-proxy/. Dans les commentaires quelqu'un a également suggéré Coro/AnyEvent - Je n'ai pas encore joué avec, mais vous voudrez peut-être vérifier.

Questions connexes