Как я могу сопоставить локальный сокет unix с сокетом inet?
-
23-08-2019 - |
Вопрос
Мне любопытно, возможно ли сопоставить сокет 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
Для
- Прослушивание через TCP-порт 6666 (с
SO_REUSEADDR
) - Подождите, чтобы принять соединение
- Когда соединение установлено, разветвляйте.В дочернем элементе выполните описанные ниже действия.В родительском окне перейдите к 2.
- Откройте доменное соединение UNIX с
/var/lib/mysql/mysql.sock
розетка. - Передайте данные между двумя конечными точками, затем выйдите.
Пишу это наоборот
socat -v unix:/var/lib/mysql/mysql.sock tcp-l:6666,reuseaddr,fork
не работает, потому что это инструктирует socat
Для
- Откройте доменное соединение UNIX с
/var/lib/mysql/mysql.sock
розетка. - Прослушивание через TCP-порт 6666 (с
SO_REUSEADDR
) - Подождите, чтобы принять соединение
- Когда соединение установлено, создайте дочерний элемент worker для передачи данных между двумя адресами.
- Родительский сервер продолжает принимать подключения по второму адресу, но первый адрес больше не доступен:это было дано первому ребенку.Так что с этого момента ничего полезного сделать нельзя.
Другие советы
Да, вы можете сделать это в Perl.
Посмотрите на perlipc ( перлипк ), Ввод-вывод::Выбрать, IO::Розетка и Руководство Beej по сетевому программированию.
Возможно, вы захотите рассмотреть возможность выполнения этого в POE - это асинхронная библиотека для обработки событий, так что, похоже, она отлично подходит для этой задачи.
Это не на 100% актуально, но я использую POE для написания прокси-сервера между протоколом без состояния (HTTP) и протоколом с полным состоянием (сеанс telnet, а более конкретно - сеанс MUD), и это было довольно просто - вы можете проверить код здесь: http://www.depesz.com/index.php/2009/04/08/learning-poe-http-2-mud-proxy/.
В комментариях кто-то также предложил Coro / AnyEvent - я с ним еще не играл, но вы, возможно, захотите проверить.