Как я могу сопоставить локальный сокет unix с сокетом inet?

StackOverflow https://stackoverflow.com/questions/893730

Вопрос

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

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

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

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

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

Спасибо.

Это было полезно?

Решение

Измените порядок ваших аргументов на 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. Когда соединение установлено, создайте дочерний элемент worker для передачи данных между двумя адресами.
  5. Родительский сервер продолжает принимать подключения по второму адресу, но первый адрес больше не доступен:это было дано первому ребенку.Так что с этого момента ничего полезного сделать нельзя.

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top