AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 706598
Accepted
Gabriel Staples
Gabriel Staples
Asked: 2022-06-18 13:45:04 +0800 CST2022-06-18 13:45:04 +0800 CST 2022-06-18 13:45:04 +0800 CST

"Conexão recusada" quando tento enviar um pacote UDP com netcat em uma placa linux incorporada

  • 772

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

networking embedded
  • 1 1 respostas
  • 471 Views

1 respostas

  • Voted
  1. Best Answer
    Gabriel Staples
    2022-06-22T22:40:51+08:002022-06-22T22:40:51+08:00

    Resumo

    Se o seu ouvinte estiver vinculado a um IP específico (como 192.168.0.10) e porta (como 10000) em vez de IP INADDR_ANY(Internet Namespace Address Any), faça isso para especificar o IP correto:

    # with netcat
    nc -w 1 -u 192.168.0.10 10000 < my_binary_packet.bin
    
    # OR (same thing), with socat
    socat udp:192.168.0.10:10000 - < my_binary_packet.bin
    

    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á ouvindo localhost( 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 de localhostou 127.0.0.1, mas aparentemente você pode.

    Então, isso funciona em vez disso:

    nc -w 1 -u 192.168.0.10 10000 < my_binary_packet.bin
    

    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+ Co ncprocesso 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!):

    socat udp:192.168.0.10:10000 - < my_binary_packet.bin
    

    Além disso, aqui estão minhas versões de netcate socatna placa Linux embarcada.

    # nc -h
    GNU netcat 0.7.1, a rewrite of the famous networking tool.
    
    # nc -V
    netcat (The GNU Netcat) 0.7.1
    Copyright (C) 2002 - 2003  Giovanni Giacobbi
    
    # socat -V
    socat by Gerhard Rieger and contributors - see www.dest-unreach.org
    socat version 1.7.3.4 on May  6 2022 17:55:04
    

    Indo além

    Como construir um pacote binário em C ou C++ para enviar via netcatousocat

    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 o write()comando Linux.

    Gravar o pacote em um arquivo binário como esse permite um teste fácil via netcatou socat, 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:

    int file = open("my_binary_packet.bin", O_WRONLY | O_CREAT, 0644);
    

    E aqui está como é a definição da estrutura. O my_binary_packet.binarquivo 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:

    struct __attribute__((__packed__)) my_packet {
        bool flag1;
        bool flag2;
        bool flag3;
    };
    

    O código completo para abrir o arquivo, criar o pacote e gravar o pacote binário em um arquivo pode ser assim:

    typedef struct __attribute__((__packed__)) my_packet_s {
        bool flag1;
        bool flag2;
        bool flag3;
    } my_packet_t;
        
    int file = open("my_binary_packet.bin", O_WRONLY | O_CREAT, 0644);
    if (file == -1)
    {
        printf("Failed to open. errno = %i: %s\n", errno, strerror(errno));
        return;
    }
    
    my_packet_t my_packet = 
    {
        .flag1 = true,
        .flag2 = true,
        .flag3 = true,
    };
    
    ssize_t num_bytes_written = write(file, &my_packet, sizeof(my_packet));
    if (num_bytes_written == -1)
    {
        printf("Failed to write. errno = %i: %s\n", errno, strerror(errno));
        return;
    }
    
    int retcode = close(file);
    if (retcode == -1)
    {
        printf("Failed to close. errno = %i: %s\n", errno, strerror(errno));
        return;
    }
    

    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:

    1. socket__geeksforgeeks_udp_server_GS_edit_GREAT.c
    2. socket__geeksforgeeks_udp_client_GS_edit_GREAT.c

    Referências

    1. Os comentários na minha pergunta.
    2. Existem muitas versões do netcat: Netcat - Como escutar uma porta TCP usando o endereço IPv6?
    3. Esta resposta e meu comentário aqui: Erro ao receber em UDP: Conexão recusada
    • 0

relate perguntas

  • Pergunta sobre arquivos montados em rede

  • Um endereço IP pode terminar em 255 e não ser um endereço IP de transmissão?

  • Incapaz de identificar qual saída de endereço MAC do comando arp ou comando ip está correta

  • Roteador estranho funciona com centos 6 [fechado]

  • Acesse o sistema de arquivos como usuário root

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve