Как я могу сопоставить локальный сокет Unix с сокетом Inet? - PullRequest
2 голосов
/ 21 мая 2009

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

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

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

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

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

Спасибо.

Ответы [ 3 ]

6 голосов
/ 22 мая 2009

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

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

Это инструктирует socat до

  1. прослушивание TCP-порта 6666 (с SO_REUSEADDR)
  2. Подождите, чтобы принять соединение
  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. Подождите, чтобы принять соединение
  4. Когда соединение установлено, порождает рабочего потомка для передачи данных между двумя адресами.
  5. Родитель продолжает принимать соединения по второму адресу, но больше не имеет первого доступного адреса: он был передан первому дочернему элементу. Поэтому с этого момента ничего полезного сделать нельзя.
0 голосов
/ 21 мая 2009

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

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

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

0 голосов
/ 21 мая 2009

Да, вы можете сделать это в Perl.

Посмотрите на perlipc , IO :: Select , IO :: Socket и Руководство Биджа по сетевому программированию .

...