static int zyre_node_start (zyre_node_t *self) { // If application didn't bind explicitly, we grab an ephemeral port // on all available network interfaces. This is orthogonal to // beaconing, since we can connect to other peers and they will // gossip our endpoint to others. if (!self->bound) { self->port = zsock_bind (self->inbox, "tcp://*:*"); if (self->port < 0) return 1; // Could not get new port to bind to? self->bound = true; } // Start UDP beaconing, if the application didn't disable it if (self->beacon_port) { assert (!self->beacon); self->beacon = zbeacon_new (NULL, self->beacon_port); if (!self->beacon) return 1; // Not possible to start beacon if (self->interval) zbeacon_set_interval (self->beacon, self->interval); zpoller_add (self->poller, zbeacon_socket (self->beacon)); // Set broadcast/listen beacon beacon_t beacon; beacon.protocol [0] = 'Z'; beacon.protocol [1] = 'R'; beacon.protocol [2] = 'E'; beacon.version = BEACON_VERSION; beacon.port = htons (self->port); zuuid_export (self->uuid, beacon.uuid); zbeacon_noecho (self->beacon); zbeacon_publish (self->beacon, (byte *) &beacon, sizeof (beacon_t)); zbeacon_subscribe (self->beacon, (byte *) "ZRE", 3); // Our own host endpoint is provided by the beacon assert (!self->endpoint); self->endpoint = zsys_sprintf ("tcp://%s:%d", zbeacon_hostname (self->beacon), self->port); } else if (!self->endpoint) { char *hostname = zsys_hostname (); self->endpoint = zsys_sprintf ("tcp://%s:%d", hostname, self->port); zstr_free (&hostname); } // Start polling on inbox zpoller_add (self->poller, self->inbox); return 0; }
static void zyre_node_start (zyre_node_t *self) { // Set broadcast/listen beacon beacon_t beacon; beacon.protocol [0] = 'Z'; beacon.protocol [1] = 'R'; beacon.protocol [2] = 'E'; beacon.version = BEACON_VERSION; beacon.port = htons (self->port); zuuid_export (self->uuid, beacon.uuid); zbeacon_noecho (self->beacon); zbeacon_publish (self->beacon, (byte *) &beacon, sizeof (beacon_t)); zbeacon_subscribe (self->beacon, (byte *) "ZRE", 3); // Our own host endpoint is provided by the beacon self->host = zbeacon_hostname (self->beacon); // Set up log instance char sender [30]; // ipaddress:port endpoint sprintf (sender, "%s:%d", self->host, self->port); self->log = zyre_log_new (self->ctx, sender); }