매우 이상한 상황을 만났습니다.sendto() 반환 오류 코드 ENETDOWN
내 프로그램에서 sendto()
함수는 네트워크가 작동 중이고 trying이 성공하더라도 오류 코드 ENETDOWN(Network is down)
을 반환합니다.
스트림이 UDP 스트림이 여러 게이트웨이를 통해 다른 네트워크에 연결될 때만 발생합니다. 가끔은 항상 그런 것은 아닙니다. 동일한 서브 네트워크에서 동일한 코드를 실행하면 ENETDOWN
과 같은 오류가 없습니다.
그래서 sendto()
은 커널 영역으로 추적됩니다. 의 함수는 ip_finish_output2()
이 iop_output.c
이고 hh->hh_output()
을 호출하고 ENETDOWN
오류 코드를 반환합니다.
정상적으로 작동하면 hh->hh_output()
기능이 에 할당되고 패킷이 네트워크로 전송됩니다.
문제가 발생하면 의 neigh_blackhole()
기능에 할당 된 것으로 보입니다. neighbour.c
입니다. neigh_blackhole()
은 -ENETDOWN
코드를 반환합니다.
그러나 언제 neigh_destroy()
이 호출되는지, 왜 그 기능이 호출되는지는 알 수 없습니다.
저는 몇 주 동안이 문제로 고심하고 있습니다.
내 프로그램이 실행되는 컴퓨터가 ICMP 리디렉션 메시지를받는 경우 인접 프로그램을 제거 할 수 있습니까? – shin2011
"호스트로 리디렉션"코드와 새 게이트웨이 주소가있는 ICMP 리디렉션 메시지를 볼 수 있습니다. – shin2011
ICMP 리다이렉트가 원인인지 알기 위해 커널 코드를 보지 않았지만 확실히 가능합니다. -ENETDOWN 오류를 일시적인 것으로 처리하고 다시 시도하는 것을 권장합니다. 아마도 지연과 어쩌면 백 오프로 처리 할 수도 있습니다. –