1. ホーム
  2. c

[解決済み] 要求されたアドレスが割り当てられない - 考えられる原因は?

2022-03-03 07:54:26

質問

マスターサーバと分散配置されたスレーブサーバで構成されるプログラムがあります。スレーブサーバはサーバに状態を送信し、一定期間特定のスレーブから連絡がない場合、そのスレーブをダウンとしてマークします。これは一貫して起こっています。

ログを調査したところ、スレーブはサーバーに1回だけステータスアップデートを送ることができ、その後、別のアップデートを送ることができず、常にconnect()の呼び出しで失敗していることがわかりました "Cannot assign requested address (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つの呼び出しのいずれかに失敗すると、その関数は失敗する。

解決方法は?

SO_REUSEADDRが役に立つかも? http://www.unixguide.net/network/socketfaq/4.5.shtml