로컬 UNIX 소켓을 INET 소켓에 매핑하려면 어떻게해야합니까?
-
23-08-2019 - |
문제
UNIX 소켓을 INET 소켓에 매핑 할 수 있는지 궁금합니다. 상황은 단순히 MySQL 서버에 연결하고 싶다는 것입니다. 불행히도 INET 소켓이 비활성화되어 있으므로 유닉스 소켓과 만 연결할 수 있습니다. 내가 사용중인 도구/쓰기 도구는 INET 소켓에 연결해야하므로 다른 하나에 매핑 할 수 있는지 확인하려고합니다.
상당한 양의 검색이 걸렸지 만 소사이어티, 내가 찾고있는 일을 취합니다. 나는 누군가가 이것을 달성하는 방법에 대한 제안이 있는지 궁금합니다. 내가 사용했던 명령 줄 (부분 성공)은 다음과 같습니다.
socat -v UNIX-CONNECT:/var/lib/mysql/mysql.sock TCP-LISTEN:6666,reuseaddr
이제 연결을 만들고 서버와 대화 할 수 있습니다. 불행히도 포크 옵션을 사용해야하므로 여러 연결을하려는 시도가 실패하지만이 옵션은 연결을 작동하지 않는 것으로 보입니다.
나는 Perl (내가 선호하는 언어)로 문제를 해결할 수 있다는 것을 알고 있지만, 전체 구현을 직접 작성하지 않기를 바랍니다. 나는 io :: 소켓 라이브러리에 익숙합니다. 나는 누군가가 이런 종류의 일을 경험하기를 바랍니다. 제안/아이디어에 열려 있습니다.
감사.
해결책
당신의 주장의 순서를 뒤집습니다 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
) - 연결을 수락하기를 기다립니다
- 연결이 이루어지면 근로자 자녀를 스폰하여 두 주소간에 데이터를 전송하십시오.
- 부모는 두 번째 주소에서 계속 연결을 수락하지만 더 이상 첫 번째 주소가 없습니다. 첫 번째 자녀에게 주어졌습니다. 따라서이 시점에서 유용한 것은 없습니다.
다른 팁
예, Perl 에서이 작업을 수행 할 수 있습니다.
보다 perlipc, io :: 선택, io :: 소켓 그리고 Beej의 네트워크 프로그래밍 안내서.
POE에서 수행하는 것을 고려할 수 있습니다. 이벤트를 다루기위한 비동기 라이브러리이므로 작업에 적합한 것처럼 보입니다.
100% 관련은 아니지만 POE를 사용하여 Sationeless Protocol (HTTP)과 StateFull 프로토콜 (Telnet Session,보다 구체적으로 Mud 세션) 사이에 프록시를 작성하며 다소 간단했습니다. 여기에서 코드를 확인할 수 있습니다. http://www.depesz.com/index.php/2009/04/08/learning-poe-http-2-mud-proxy/.
의견에서 누군가가 Coro/Anyevent를 제안했습니다. 아직 연주하지는 않았지만 확인하고 싶을 수도 있습니다.