J'ai rencontré une situation très étrange.sendto() renvoie le code d'erreur ENETDOWN
Dans mon programme, la fonction sendto()
renvoie le code d'erreur ENETDOWN(Network is down)
même si le réseau est en cours et que ping tryout a abouti.
Il s'est produit uniquement lorsque le flux UDP se connecte à un autre réseau via plusieurs passerelles. Ce n'est pas toujours et arrive parfois. Si je cours le même code sous le même sous-réseau, il n'y a pas d'erreur comme ENETDOWN
. Donc, je trace sendto()
fonction à Zone du noyau. La fonction neigh_hh_output()
dans ip_finish_output2()
de iop_output.c
appelle hh->hh_output()
et il renvoie le code d'erreur ENETDOWN
.
En fonctionnement normal, la fonction hh->hh_output()
est affectée à dev_queue_xmit()
de dev.c
et les paquets sont envoyés au réseau.
Lorsqu'un problème est survenu, il semble affecté à la fonction neigh_blackhole()
dans neigh_destroy()
de neighbour.c
. Le neigh_blackhole()
renvoie le code -ENETDOWN
. Mais, je ne sais pas quand le neigh_destroy()
est appelé et pourquoi cette fonction est appelée.
Je suis aux prises avec ce problème depuis plusieurs semaines.
Si la machine sur laquelle mon programme s'exécute reçoit un message de redirection ICMP, est-ce que le voisin peut supprimer? – shin2011
Je peux voir le message de redirection ICMP qui a le code "rediriger pour l'hôte" et la nouvelle adresse de passerelle. – shin2011
Je n'ai pas regardé le code du noyau pour voir si une redirection ICMP causerait cela, mais c'est certainement possible. Je conseillerais de traiter l'erreur -ENETDOWN comme quelque chose de transitoire et de réessayer, peut-être avec un retard et peut-être aussi avec un backoff. –