2009-05-21 6 views
2

Мне любопытно, можно ли сопоставить сокет UNIX с гнездом INET. Ситуация просто заключается в том, что я хотел бы подключиться к серверу MySQL. К сожалению, у него отключены разъемы INET, поэтому я могу подключаться только к UNIX-сокетам. Инструменты, которые я использую/записываю, должны подключаться к сокету INET, поэтому я пытаюсь проверить, могу ли я сопоставить один с другим.Как я могу сопоставить локальный сокет unix со встроенным сокетом?

Потребовалось много места, но я нашел socat, который якобы делает то, что я ищу. Мне было интересно, есть ли у кого-нибудь предложения о том, как это сделать. Командной строки Я использую (с частичным успехом) является:

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

Теперь я могу сделать связи и общаться с сервером. К сожалению, все попытки сделать несколько подключений завершены неудачно, поскольку мне нужно использовать опцию fork, но этот параметр, по-видимому, делает соединения нефункциональными.

Я знаю, что могу решить проблему с Perl (мой предпочтительный язык), но я бы предпочел не писать всю реализацию сам. Я знаком с библиотеками IO :: Socket, я просто надеюсь, что у кого-то есть опыт такого рода вещей. Открыт для предложений/идей.

Спасибо.

ответ

6

Отмените порядок своих аргументов до socat, и он работает.

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

Это указывает на socat

  1. Слушать на TCP порт 6666 (с SO_REUSEADDR)
  2. Wait принять соединение
  3. Когда соединение сделано, вилка. В дочернем устройстве выполните следующие действия. В родителе перейдите к 2.
  4. Откройте подключение домена UNIX к сокету /var/lib/mysql/mysql.sock.
  5. Передача данных между двумя конечными точками, затем выход.

Дать ему другой путь вокруг

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

не работает, потому что это инструктирует socat к

  1. Открыть подключение домена UNIX к /var/lib/mysql/mysql.sock розеткой.
  2. Слушать на TCP порт 6666 (с SO_REUSEADDR)
  3. Wait принять соединение
  4. Когда соединение установлено, нерест работник ребенка для передачи данных между двумя адресами.
  5. Родитель продолжает принимать соединения по второму адресу, но больше не имеет первого доступного адреса: он был передан первому ребенку. Так что ничего полезного с этого момента нельзя сделать.
+0

Спасибо, это именно то, что я искал. Удивительно, какая глупая ошибка. – Danny

0

Возможно, вы захотите сделать это в POE - это асинхронная библиотека для работы с событиями, поэтому она отлично подходит для задачи.

Это не 100% актуально, но я использую POE для записи прокси-сервера между протоколом stateless (HTTP) и протоколом statefull (сеанс telnet, а точнее - сеанс MUD), и это было довольно просто - вы можете проверить код здесь: http://www.depesz.com/index.php/2009/04/08/learning-poe-http-2-mud-proxy/.

В комментариях кто-то также предложил Coro/AnyEvent - я еще не играл с ним, но вы можете проверить его.