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; }
/** * COllect Updates * * We store each update with a new sequence number, and if necessary, a * time-to-live. We publish updates immediately on our publisher socket: */ static int s_collector (zloop_t *loop, zmq_pollitem_t *poller, void *args) { clonesrv_t *self = (clonesrv_t *) args; DEBUG("I: s_collector"); kvmsg_t *kvmsg = kvmsg_recv (poller->socket); if (kvmsg) { kvmsg_set_sequence (kvmsg, ++self->sequence); kvmsg_fmt_key(kvmsg, "%s%d", SUBTREE, self->sequence-1 ); if( !strcmp(MSG_TYPE_SFD, kvmsg_get_prop (kvmsg, "type"))) { // setup the beacon // Broadcast on the zyre port beacon_announce_t ba; memset( &ba, 0, sizeof(ba)); strcpy( ba.protocol, "fontforge-collab" ); ba.version = 2; char* uuid = kvmsg_get_prop (kvmsg, "collab_uuid" ); if( uuid ) { strcpy( ba.uuid, uuid ); } else { ff_uuid_generate( ba.uuid ); } strncpy( ba.username, GetAuthor(), beacon_announce_username_sz ); ff_gethostname( ba.machinename, beacon_announce_machinename_sz ); ba.port = htons( self->port ); strcpy( ba.fontname, "" ); DEBUG("I: adding beacon, payloadsz:%zu user:%s machine:%s", sizeof(beacon_announce_t), ba.username, ba.machinename ); char* fontname = kvmsg_get_prop (kvmsg, "fontname" ); if( fontname ) { strcpy( ba.fontname, fontname ); } service_beacon = zbeacon_new( self->ctx, 5670 ); zbeacon_set_interval (service_beacon, 300 ); zbeacon_publish (service_beacon, (byte*)&ba, sizeof(ba)); } kvmsg_send (kvmsg, self->publisher); // int ttl = atoi (kvmsg_get_prop (kvmsg, "ttl")); // if (ttl) // kvmsg_set_prop (kvmsg, "ttl", // "%" PRId64, zclock_time () + ttl * 1000); DEBUG ("I: publishing update=%d type:%s", (int) self->sequence,kvmsg_get_prop (kvmsg, "type")); DEBUG("I:x hash size:%ld", zhash_size(self->kvmap)); kvmsg_store( &kvmsg, self->kvmap ); } return 0; }