A comunicação com o dispositivo é perdida quando a rede é iniciada na inicialização?

1

Eu tenho um aplicativo que abre um soquete na porta 4444 para um dispositivo (/ dev / linkToDevice). O "linkToDevice" é um link para ttyUSB0. O aplicativo é um programa c ++ que agora é um daemon e é executado na inicialização. O daemon é executado independentemente da rede. Então, quando a caixa linux é inicializada, e não há rede, o daemon inicia imediatamente e enquanto ainda não há rede, eu posso me comunicar muito bem (telnet localhost 4444). Mas, quando eu conecto um cabo de rede, ou o dhclient determina que não há DHCP e me concede um endereço IP padrão, ou simplesmente forneço uma interface ip, não consigo mais me comunicar. Eu posso, no entanto, ainda abrir a conexão telnet, apenas não obtenho resposta quando procuro por uma.

Eu uso 0.0.0.0 como o ip para abrir o socket (significando qualquer endereço IP). Eu não sinto que é um problema de código.

A parte estranha para mim é que depois que eu não consigo mais me comunicar, se eu reiniciar o daemon, tudo funciona muito bem, o que é esperado. Mas, quando eu desconecto a rede, ou desconfiguro a interface, ou faço um sudo /etc/init.d/networking restart, ou qualquer tipo de derrubar a rede e fazer o backup novamente, por todo esse processo eu nunca perco a comunicação com o dispositivo. Então, o problema acontece apenas quando eu inicializo a máquina sem rede para começar, e então de repente eu recebo uma rede. Alguma idéia de por que isso acontece apenas na inicialização?

    
por Zonxwedop 28.03.2013 / 21:27

1 resposta

0

"Mainly I need to know the difference between obtaining an eth0 interface for the first time after booting with no network, and restarting the network to re-obtain an eth0 interface after one used to be previously established. The code works for the latter."

Antes de abordar dessa maneira, descarte as manobras do serviço de rede de alto nível ("NetworkManager"). Eu sempre desabilito e coloco comandos no processo de inicialização em algum ponto apropriado (por exemplo, ifconfig eth0 up && dhclient eth0 ), então manualmente executo outros scripts simples para alternar de eth para wifi etc. O NetworkManager é um polvo gigante de automação que é sem dúvida muito útil se você não sabe o que é uma "interface" ou está dirigindo com um laptop tentando se movimentar em redes Wi-Fi, mas se você preferir apenas ligar e desligar as coisas sozinho, ele pode fazer escolhas irritantes e misteriosas. Admito que nunca aprendi a configurá-lo com base na premissa de que uma ferramenta de alto nível que é mais difícil de usar para executar uma tarefa específica do que as ferramentas de baixo nível que "gerencia" não é uma ferramenta apropriada no contexto dessa tarefa. / p>

Caso isso não esteja claro:

when I unplug the network, or unconfigure the interface, or do a sudo /etc/init.d/networking restart

/etc/init.d/networking implica em um sistema .deb (os .rpm usam /etc/init.d/network ). Desabilite este (e / ou o serviço upstart correspondente em sistemas que usam upstart) para que ele não seja executado na inicialização e o substitua por qualquer comando simples que você precise acessar sua rede em algum momento no final do processo de inicialização . Se existir, eu também comento tudo em /etc/network/interfaces exceto lo.

Eu normalmente não consideraria esse bom conselho distribuir para outros usuários, mas seu problema para mim é apenas gritar, "por favor, é esse polvo gigante" - que você precisa descartar antes de olhar para trás.

    
por 29.03.2013 / 11:31