マスターサーバーと分散スレーブサーバーで構成されるプログラムがあります。スレーブサーバーはステータスの更新をサーバーに送信し、サーバーが特定のスレーブから一定期間連絡がない場合は、スレーブにダウンのマークを付けます。これは一貫して起こっています。
ログを調べたところ、スレーブは1つのステータス更新のみをサーバーに送信でき、その後、別の更新を送信できず、常にconnect()の呼び出しに失敗することがわかりました。「要求されたアドレスを割り当てることはできません(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つの呼び出しのいずれかで失敗すると、関数は失敗します。