Quero ter um servidor enviando pacotes UDP de transmissão e dois outros clientes, na mesma máquina, recebendo-os. Posso fazer isso de alguma forma? Qual endereço IP eu usaria?
@gravyface me deu esperança, mas tentei:
- Servidor enviando para 127.255.255.255:54321 e clientes ouvindo 0.0.0.0:54321.
- Servidor enviando para 127.255.255.255:54321 e clientes ouvindo 127.0.0.1:54321.
- servidor enviando para 127.255.255.255:54321 e clientes ouvindo 127.255.255.255:54321.
Nenhum deles funcionou!:(
OBS: estou utilizando as opções REUSE_ADDR e SO_BROADCAST.
Responder1
Primeira janela:
socat -u udp-recv:12345,reuseaddr -
Segunda janela:
socat -u udp-recv:12345,reuseaddr -
Terceira janela
socat - udp-sendto:127.255.255.255:12345,broadcast
Em seguida, insira algumas linhas de texto na terceira janela e veja se você consegue alguma coisa nas outras duas.
Substitua "socat" por "strace -fe network socat" para ver quais chamadas de sistema estão realmente sendo feitas (supondo que você esteja no Linux, outros unices têm equivalentes às vezes chamados de tusc, struss ou dtruss). socat é de código aberto e pacotes binários estão disponíveis para a maioria dos sistemas operacionais.
socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) = 3
setsockopt(3, SOL_SOCKET, SO_BROADCAST, [1], 4) = 0
sendto(3, "qwe\n", 4, 0, {sa_family=AF_INET, sin_port=htons(12345), sin_addr=inet_addr("127.255.255.255")}, 16) = 4
Acima, os "clientes" receptores ligam-se ao endereço INADDR_ANY. O que descobri e não sei por que é que, se você vincular a um endereço na sub-rede de loopback, não verá os pacotes chegando.
Veja também:
$ ip route show table local dev lo scope link
broadcast 127.0.0.0 proto kernel src 127.0.0.1
broadcast 127.255.255.255 proto kernel src 127.0.0.1
Se os clientes se vincularem a 127.0.0.0 ou 127.255.255.255 e o servidor enviar para esse mesmo endereço (com SO_BROADCAST), também funcionará.
Responder2
Enviando tráfego de transmissão para 127.255.255.255devefunciona, mas obviamente teste (e Wireshark/tcpdump é seu amigo aqui).
Obviamente, seus clientes também precisam ouvir no dispositivo de loopback.