従来の UNIX ソケットに関して、ZeroMQ でソケットを操作することは意味がないように思えます。ZeroMQ の誤った認識に基づいて、分散検索アルゴリズムのアーキテクチャを設計しました。私のプログラムには、他のエージェントを監視してデータを収集するエージェントがいます。実際のデータは、PULL-PUSH または PUB-SUB パターンに従ってエージェント間で転送されます。各エージェントには、着信メッセージをリッスンする PULL ソケットがあります。各メッセージには、送信者 ID を指定する ID 番号が含まれています。
初期化段階で、モニターはその REP ソケットでリッスンすることになっています。各エージェントはモニターの既知の REP ソケットに接続し、自己紹介します (エージェントの ID 番号とエージェントがリッスンしているポート番号を送信します)。モニターは、エージェントに関するすべてのデータを次の 3 つのフィールドのレコードに保存します<ID, IP, port>
。(ここで私は ZMQ の問題を抱えています。) 特定の数のエージェントの準備が整うと、モニターはすべてのデータ (各エージェントの<IP,ID,port>
) をすべてのエージェントに送信します。最後のステップは、エージェントとモニター間の PUB-SUB パターンによって行われます。
この画像は、私が何を実装するつもりだったかを理解するのに役立つかもしれません:
上の図では、モニターはそのテーブルを全員に送信する必要があります。重要な問題は、REQ-REP パターンでリクエスター (任意のエージェント) のパブリック IP アドレスを取得する方法です。すべてのエージェントは、ローカル ホスト (127.0.0.1) にバインドします。それらは、任意の数のホストに配布されることになっています。そのため、お互いのパブリック IP を知る必要があります。
解決策が存在しない場合は、アーキテクチャの再設計に関するヘルプが適切です。
アップデート
私が考えることができる解決策の候補は、各エージェントを変更して、localhost
. パブリック IP アドレスを取得する魔法の方法があれば、エージェントは自分のアドレスをモニターに送信できます。
2 回目の更新
現在、エージェントはパブリック IP アドレスを取得し、メッセージを介してサーバーに送信します。
std::string AIT::ABT_Socket::getIP() {
std::string address = "";
FILE * fp = popen("ifconfig", "r");
if (fp) {
char *p = NULL, *e;
size_t n;
while ((getline(&p, &n, fp) > 0) && p) {
if (p = strstr(p, "inet addr:")) {
p += 10;
if (e = strchr(p, ' ')) {
*e = '\0';
return std::string(p);
address = std::string(p);
}
}
}
}
pclose(fp);
return address;
}