У меня есть программа, которая состоит из главного сервера и распределенных подчиненных серверов. Ведомые серверы отправляют обновления статуса на сервер, и если сервер не слышал от определенного ведомого в фиксированный период, он отмечает, что ведомое устройство считается down. Это происходит последовательно.
При проверке журналов я обнаружил, что ведомое устройство может отправлять только одно обновление статуса на сервер, а затем никогда не может отправлять другое обновление, всегда не выполняющее вызов для соединения() "Невозможно назначить запрошенный адрес ( 99).
Как ни странно, подчиненный может отправлять на сервер несколько других обновлений, и все соединения происходят на одном и том же порту. Похоже, что наиболее распространенной причиной этого отказа является то, что соединения остаются открытыми, но мне трудно найти что-то, что осталось открытым. Существуют ли другие возможные объяснения?
Чтобы уточнить, вот как я соединяюсь:
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);
Этот код находится в функции для получения соединения с другим сервером, а сбой при любом из этих 4 вызовов приводит к сбою функции.