Pergunta

Estou curioso para saber se é possível mapear um soquete de UNIX para uma tomada INET. A situação é, simplesmente, que eu gostaria de conectar a um servidor MySQL. Infelizmente ele tem INET soquetes desativado e, portanto, só pode se conectar com soquetes UNIX. As ferramentas que estou usando / escrita têm de se conectar a uma tomada INET, então eu estou tentando ver se eu pode mapear um para o outro.

Levou uma quantidade razoável de pesquisa, mas eu fiz encontrar socat , que supostamente faz O que estou olhando. Eu queria saber se alguém tem alguma sugestão sobre como fazer isso. A linha de comando Eu tenho usado (com sucesso parcial) é:

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

Agora eu posso fazer conexões e falar com o servidor. Infelizmente quaisquer tentativas de fazer múltiplas conexões falhar como eu preciso usar a opção garfo, mas esta opção parece tornar as conexões não-funcionais.

Eu sei que posso resolver o problema com Perl (meu idioma preferido), mas eu prefiro evitar escrever toda a implementação do mesmo. I familiarizado com as bibliotecas IO :: Socket, estou simplesmente esperando que alguém tem experiência fazendo este tipo de coisa. Aberto a sugestões / ideias.

Graças.

Foi útil?

Solução

Inverter a ordem dos seus argumentos para socat, e ele funciona.

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

Esta instrui socat para

  1. Ouça na porta TCP 6666 (com SO_REUSEADDR)
  2. Espere para aceitar uma conexão
  3. Quando a conexão é feita, garfo. Na criança, continue os passos abaixo. No pai, ir para 2.
  4. Abrir uma conexão de domínio UNIX à tomada /var/lib/mysql/mysql.sock.
  5. Os dados de transferência entre os dois pontos de extremidade, em seguida, saia.

Escrevê-lo o contrário

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

não trabalho, porque isso instrui socat para

  1. Abrir uma conexão de domínio UNIX à tomada /var/lib/mysql/mysql.sock.
  2. Ouça na porta TCP 6666 (com SO_REUSEADDR)
  3. Espere para aceitar uma conexão
  4. Quando a conexão é feita, gerar uma criança trabalhador para transferir dados entre os dois endereços.
  5. O pai continua a aceitar conexões no segundo endereço, mas não tem mais o primeiro endereço disponível: foi dado ao primeiro filho. Então, nada de útil pode ser feito a partir deste ponto.

Outras dicas

Sim, você pode fazer isso em Perl.

perlipc , IO :: Select , IO :: socket e de Beej Guia de Rede programação.

Você pode querer considerar fazê-lo em POE -. É biblioteca assíncrona para lidar com eventos, de modo que parece ótimo para a tarefa

Não é 100% relevante, mas eu uso POE para o proxy de gravação entre o protocolo sem estado (HTTP) e protocolo statefull (sessão de telnet, e mais especificamente - sessão MUD), e foi bastante simples - Você pode verificar o código em aqui: http: / /www.depesz.com/index.php/2009/04/08/learning-poe-http-2-mud-proxy/ .

No alguém comentários também sugeriu Coro / AnyEvent -. Eu não tenho jogado com ele ainda, mas você pode querer verificá-lo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top