2013-05-24 12 views
11

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 De-centralized Search

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; 
} 
+0

Nur zur Klarstellung, Sie sagen, der Monitor muss die IP-Adresse der Agenten kennen, damit er ihnen ihre Tabelle senden kann? – raffian

+0

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 –

+0

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

Antwort

2

Boost kann Ihre IP-Adresse in einer tragbaren Weise bestimmen, wie folgt:

Aber das bedeutet nicht, es ist eine einfache Lösung - was ist, wenn die Box mehrere IPs/NICs/WAN/LAN usw. hat .... Wann Ich hatte kürzlich eine ähnliche Situation, ich zwang den Anrufer, die gewünschte IP und den Port explizit in der Befehlszeile anzugeben, und teilte ihn dann bei der Verbindung mit anderen Prozessen auf anderen Hosts (in meinem Fall über HTTP).

0

Warum senden Sie es nicht einfach als Teil der Nutzlast durch?