web-dev-qa-db-ja.com

要求されたアドレスを割り当てることができない-考えられる原因は?

マスターサーバーと分散スレーブサーバーで構成されるプログラムがあります。スレーブサーバーはステータスの更新をサーバーに送信し、サーバーが一定期間内に特定のスレーブから聞いていない場合、スレーブをダウンとしてマークします。これは一貫して発生しています。

ログを調べると、スレーブはサーバーにステータスの更新を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つの呼び出しのいずれかが失敗すると、関数が失敗します。

20
dbeer

ここでSO_REUSEADDRが役立つのでしょうか? http://www.unixguide.net/network/socketfaq/4.5.shtml

9
Michel

問題は、実際にはアドレスがビジーであるということでした。ビジー状態は、ネットワーク通信の処理方法に関する他のいくつかの問題が原因でした。あなたの意見は私がこれを理解するのを助けてくれました。ありがとうございました。

編集:具体的には、ネットワーク通信の処理における問題は、最初の障害が発生した場合、これらのステータス更新が常に再送信されることでした。すべての分散スレーブがステータスの更新を同時に送信しようとするのは時間の問題であり、ネットワークが飽和状態になりました。

7
dbeer

これは暗闇の中でのショットです。最初にバインドなしで接続を呼び出すと、システムはローカルポートを割り当てます。カーネルソースファイルinet_connection_sock.cは、この状態を示唆しています。実験のように、最初にローカルポートへのバインドを試みて、各バインド/接続が異なるローカルポート番号を使用していることを確認してください。

5
dmh2000