포트 4444의 장치(/dev/linkToDevice)에서 소켓을 여는 애플리케이션이 있습니다. "linkToDevice"는 ttyUSB0에 대한 링크입니다. 응용 프로그램은 이제 데몬이며 시작 시 실행되는 C++ 프로그램입니다. 데몬은 네트워크에 관계없이 실행됩니다. 따라서 Linux 시스템이 부팅되고 네트워크가 없으면 데몬이 즉시 시작되고 여전히 네트워크가 없어도 제대로 통신할 수 있습니다(telnet localhost 4444). 그러나 네트워크 케이블을 연결하거나 dhclient가 DHCP가 없다고 판단하고 기본 IP 주소를 임대하거나 단순히 IP 인터페이스를 제공하면 더 이상 통신할 수 없습니다. 그러나 여전히 텔넷 연결을 열 수는 있지만 연결을 쿼리할 때 아무런 응답도 받지 못합니다.
소켓을 여는 IP(모든 IP 주소를 의미함)로 0.0.0.0을 사용합니다. 나는 이것이 코드 문제라고 생각하지 않습니다.
저에게 이상한 점은 더 이상 통신할 수 없게 된 후 데몬을 다시 시작하면 예상대로 모든 것이 잘 작동한다는 것입니다. 그러나 네트워크를 분리하거나 인터페이스 구성을 해제하거나 sudo /etc/init.d/networking을 수행하여 재부팅하거나 어떤 방식으로든 네트워크를 종료하고 재부팅할 때 전체 프로세스 동안 장치와의 연결이 끊어지지 않습니다. 따라서 네트워크 없이 컴퓨터를 시작한 다음 갑자기 네트워크를 얻는 경우에만 문제가 발생합니다. 왜 이런 일이 부팅 시에만 발생하는지에 대한 아이디어가 있나요?
답변1
"주로 네트워크 없이 부팅한 후 처음으로 eth0 인터페이스를 얻는 것과 이전에 네트워크를 설정하고 네트워크를 다시 시작한 후 eth0 인터페이스를 다시 얻는 것 사이의 차이점을 알아야 합니다. 코드는 후자에 대해 작동합니다."
이런 방식으로 접근하기 전에 고급 네트워크 서비스("NetworkManager") 헛소리를 배제하세요. 나는 항상 그것을 비활성화한 다음 부팅 프로세스의 적절한 지점(예: )에 명령을 붙여넣은 ifconfig eth0 up && dhclient eth0
다음 다른 간단한 스크립트를 수동으로 실행하여 eth에서 wifi 등으로 전환합니다. NetworkManager는 거대한 자동화 문어입니다. "인터페이스"가 무엇인지 모르거나 Wi-Fi 네트워크에서 로밍하려고 노트북을 운전하는 경우 장치를 켜고 사용하는 것을 선호하면 놀라운 작업을 수행할 수 있습니다. 짜증나고 신비한 선택입니다. 나는 높은 수준의 도구가 "관리"하는 낮은 수준의 도구보다 특정 작업에 사용하기가 더 어렵고 해당 작업의 맥락에서 적절한 도구가 아니라고 가정할 때 구성 방법을 전혀 배우지 못했다는 것을 인정합니다.
명확하지 않은 경우:
네트워크를 분리하거나 인터페이스 구성을 해제하거나 sudo /etc/init.d/networking restart를 수행할 때
/etc/init.d/networking
.deb 시스템( .rpm 에서 사용 /etc/init.d/network
)을 의미합니다. 장애를 입히다따라서 이 서비스(및/또는 upstart를 사용하는 시스템의 해당 upstart 서비스)는 부팅 시 실행되지 않으며 나중에 부팅 프로세스에서 네트워크에 액세스하는 데 필요한 간단한 명령으로 대체됩니다. 나는 또한 lo 가 존재하는 경우를 /etc/network/interfaces
제외한 모든 것을 주석 처리할 것입니다.
나는 일반적으로 이 좋은 조언을 다른 사용자에게 배포하는 것을 고려하지 않지만 귀하의 질문은 "저건 거대한 문어인 것 같아요"라고 비명을 지르고 있습니다. 이 시점에서 뒤를 보기 전에 실제로 그것을 배제해야 합니다.