Estou tentando usar socat como um proxy UDP (v4- > v6) para um cliente (jogo) que rotineiramente inicia novas "conexões" UDP (TL; DR - o mundo é executado em vários servidores ouvindo em UDP diferente portas, o cliente permanece conectado a um servidor em particular, e precisará se conectar a outro, enquanto o jogador viaja entre as camadas do mundo). Pelo que entendi o manual, a opção "fork" deve cuidar disso, mantendo o socket de escuta no processo pai e bifurcando filhos ligados a um endereço "remoto" específico + porta:
$ socat UDP4-LISTEN:11001,bind=127.0.0.1,fork,reuseport,reuseaddr UDP6-SENDTO:remotehost:11001
(repeated for port 11000)
Até agora, tudo bem:
$ lsof -P -i 4UDP -a -p $(pgrep -d, socat)
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
socat 2990 myxal 5u IPv4 0x4e6e342add34664f 0t0 UDP localhost:11001
socat 2991 myxal 5u IPv4 0x4e6e342add345f2f 0t0 UDP localhost:11000
Mas quando eu realmente faço isso e executo o cliente, o pai que deve reabrir o soquete de escuta falha com "Endereço já em uso":
socat[2990] E bind(5, {LEN=16 AF=2 127.0.0.1:11001}, 16): Address already in use
Claro, lsof
confirma que não há nada escutando nesse soquete:
$ lsof -P -i 4UDP:11001
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
socat 3105 myxal 5u IPv4 0x4e6e342add34664f 0t0 UDP localhost:11001->localhost:57324
Eu posso até executar nc -u -l 11001
neste momento sem problemas. O que estou perdendo aqui?
EDIT : Estou começando a achar que o comando acima está tecnicamente correto , e estou vendo um bug no socat. ATM, estou trabalhando em torno do problema simplesmente lançando socat em um loop - os filhos que seguram o soquete conectado não são afetados, afinal de contas ...
while true; do sleep 1; socat [...] ;
Tags networking proxy socat osx