Impossible d’atsortingbuer l’adresse demandée – causes possibles?

J’ai un programme qui consiste en un serveur maître et des serveurs esclaves dissortingbués. Les serveurs esclaves envoient des mises à jour d’état au serveur, et si le serveur n’a pas entendu parler d’un esclave spécifique pendant une période déterminée, il marque l’esclave comme étant en panne. Cela se produit régulièrement.

En consultant les journaux, j’ai constaté que l’esclave n’est en mesure d’envoyer qu’une seule mise à jour d’état au serveur, puis n’est jamais capable d’en envoyer une autre, échouant toujours à l’appel de connexion () “Impossible d’atsortingbuer l’adresse demandée (99).

Curieusement, l’esclave est capable d’envoyer plusieurs autres mises à jour au serveur, et toutes les connexions se font sur le même port. Il semble que la cause la plus courante de cet échec réside dans le fait que les connexions sont laissées ouvertes, mais je ne parviens pas à trouver quoi que ce soit qui rest ouvert. Y a-t-il d’autres explications possibles?

Pour clarifier, voici comment je me connecte:

struct sockaddr *sa; // parameter size_t sa_size; //parameter int i = 1; int stream; stream = socket(AF_INET,SOCK_STREAM,0); setsockopt(stream,SOL_SOCKET,SO_REUSEADDR,&i,sizeof(i)); bindresvport(stream,NULL); connect(stream,sa,sa_size); 

Ce code est dans une fonction pour obtenir une connexion à un autre serveur, et une défaillance sur l’un de ces 4 appels entraîne l’échec de la fonction.

Peut-être que SO_REUSEADDR aide ici? http://www.unixguide.net/network/socketfaq/4.5.shtml

Il s’est avéré que le problème était vraiment que l’adresse était occupée – l’affluence était causée par d’autres problèmes liés à la gestion des communications réseau. Vos consortingbutions m’ont aidé à comprendre cela. Je vous remercie.

EDIT: pour être précis, les problèmes de traitement de nos communications réseau étaient que ces mises à jour de statut seraient constamment renvoyées si la première échouait. Ce n’était qu’une question de temps avant que chaque esclave dissortingbué essaye d’envoyer sa mise à jour de statut en même temps, ce qui saturait notre réseau.

c’est juste un coup dans l’obscurité: lorsque vous appelez Connect sans connexion d’abord, le système alloue votre port local et si vous avez plusieurs threads qui se connectent et se déconnectent, il est possible que le système alloue un port déjà utilisé. le fichier source du kernel inet_connection_sock.c fait allusion à cette condition. Tout comme une expérience, essayez d’abord de faire un lien vers un port local, en vous assurant que chaque lien / connexion utilise un numéro de port local différent.

 sysctl -w net.ipv4.tcp_timestamps=1 sysctl -w net.ipv4.tcp_tw_recycle=1