Estou tentando enviar um pacote binário para um processo local, via netcat( nc
), assim:
nc -w 1 -u localhost 10000 < my_binary_packet.bin
A saída é:
read(net): Connection refused
Alguém sabe o que está acontecendo?
obtenho o mesmo resultado comnc -w 1 -u 127.0.0.1 10000 < my_binary_packet.bin
Resumo
Se o seu ouvinte estiver vinculado a um IP específico (como
192.168.0.10
) e porta (como10000
) em vez de IPINADDR_ANY
(Internet Namespace Address Any), faça isso para especificar o IP correto:Detalhes
Ok, então eu percebi!
Eu escrevi o processo de escuta local para o qual eu estava tentando enviar o pacote binário e liguei esse soquete a um endereço IP específico
192.168.0.10
, em vez de ao endereço IP "pega-tudo"INADDR_ANY
. A vinculação a esse endereço IP específico significa que meu processo de ouvinte NÃO está ouvindolocalhost
(127.0.0.1
), então esses pacotes foram rejeitados! Eu não sabia que você poderia enviar alguns dados a um processo em execução no mesmo PC usando qualquer coisa diferente delocalhost
ou127.0.0.1
, mas aparentemente você pode.Então, isso funciona em vez disso:
O período de tempo limite/espera de 1 segundo (
-w 1
), no entanto, não parece fazer nada - não sei por quê. Ele só fica lá depois de enviar o pacote, e eu tenho que Ctrl+ Conc
processo depois que ele envia, se eu quiser enviá-lo novamente. Isso realmente não importa - o ponto é: funciona!Eu também li atentamente os comentários da minha pergunta, então aqui estão mais algumas informações para quem se pergunta:
O comando equivalente
socat
é este (não esqueça o-
no comando!):Além disso, aqui estão minhas versões de
netcat
esocat
na placa Linux embarcada.Indo além
Como construir um pacote binário em C ou C++ para enviar via
netcat
ousocat
Por fim, para quem está se perguntando, a maneira como escrevi o pacote binário
my_binary_packet.bin
é simplesmente escrevendo algum código C para gravar uma estrutura compactada em um arquivo usando owrite()
comando Linux.Gravar o pacote em um arquivo binário como esse permite um teste fácil via
netcat
ousocat
, que foi o que me levou a fazer a pergunta quando não funcionou.Certifique-se de definir as permissões de arquivo ao abrir o arquivo. Ex:
E aqui está como é a definição da estrutura. O
my_binary_packet.bin
arquivo literalmente contém apenas uma cópia byte por byte dessa estrutura dentro desse pacote binário, depois de definir valores específicos e obrigatórios para cada membro da estrutura:O código completo para abrir o arquivo, criar o pacote e gravar o pacote binário em um arquivo pode ser assim:
Para quem quer aprender a programar sockets Berkeley em C ou C++...
Eu escrevi esta demonstração realmente completa no meu repositório eRCaGuy_hello_world . Este código do servidor é o que meu processo de ouvinte UDP é baseado:
Referências