Klingt so, als ob es in ZeroMQ keinen Sinn macht, mit Sockets im Sinne traditioneller UNIX-Sockets zu arbeiten. Ich entwarf eine Architektur für einen verteilten Suchalgorithmus, basierend auf einer falschen Wahrnehmung von ZeroMQ. In meinem Programm gibt es einen Agenten, der andere Agenten überwacht und ihre Daten sammelt. Reale Daten werden zwischen Agenten übertragen, die dem PULL-PUSH- oder PUB-SUB-Muster folgen. Jeder Agent hat einen PULL-Socket, der eingehende Nachrichten überwacht. Jede Nachricht enthält eine ID-Nummer, die die Absenderkennung angibt.Wie bekomme ich die öffentliche IP des Anforderers im REQ-REP Muster von ZeroMQ?
Bei der Initialisierung sollte der Monitor auf seinen REP-Socket hören. Jeder Agent wird sich mit dem bekannten REP-Socket des Monitors verbinden und sich selbst vorstellen (sendet seine ID-Nummer und die Portnummer, die der Agent abhört). Der Monitor speichert alle Daten zu Agenten in einem Datensatz mit drei Feldern: <ID, IP, port>
. (Hier habe ich ein Problem mit ZMQ.) Wenn eine bestimmte Anzahl von Agenten bereit ist, sendet der Monitor alle Daten (Agent <IP,ID,port>
) an alle Agenten. Der letzte Schritt erfolgt durch ein PUB-SUB-Muster zwischen Agenten und Monitor. an all
In obigem Bild, soll der Monitor sendet es Tabelle: Dieses Bild kann eine Idee zu bekommen, was ich
zu implementieren gemeint helfen. Die Schlüsselfrage lautet, wie man die öffentliche IP-Adresse eines Anforderers (irgendein Agent) in einem REQ-REP-Muster erhält. Alle Agenten binden an ihren lokalen Host (127.0.0.1). Sie sollen auf beliebig vielen Hosts verteilt sein. So AFAIK müssen sie öffentliche IP von einander kennen.
Für den Fall, dass keine Lösung existiert, ist jede Hilfe beim Redesign der Architektur angebracht.
aktualisieren
Ein Kandidat Lösung, die ich mir vorstellen kann, ist jedes Mittel zu modifizieren, um seine/ihre öffentliche IP statt localhost
zu binden. Wenn es eine magische Möglichkeit gibt, eine öffentliche IP-Adresse zu erhalten, kann jeder Agent seine Adresse an den Monitor senden.
zweiter Update
Zur Zeit der Agent erhält seine öffentliche IP-Adresse und sendet sie über Nachricht an Server:
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;
}
Nur zur Klarstellung, Sie sagen, der Monitor muss die IP-Adresse der Agenten kennen, damit er ihnen ihre Tabelle senden kann? – raffian
Nein. Der Monitor muss die IP-Adresse der Agenten kennen, um diese IP-Adressen an alle zu senden. Mit anderen Worten, um die Tabelle zu konstruieren. Es kann Nachrichten senden, aber es ist nicht bekannt, IP-Adresse mit ZeroMQ: D –
10 Können Sie die IP-Adresse auf jedem Agenten in einer Konfigurationsdatei speichern, oder einfach 'ifconfig' und analysieren 'inet-Adresse', um die IP zu bekommen? Dann kann jeder Agent die IP in einer Nachricht an den Monitor senden – raffian