static zyre_peer_t * zyre_node_require_peer (zyre_node_t *self, zuuid_t *uuid, const char *endpoint) { assert (self); assert (endpoint); zyre_peer_t *peer = (zyre_peer_t *) zhash_lookup (self->peers, zuuid_str (uuid)); if (!peer) { // Purge any previous peer on same endpoint void *item; for (item = zhash_first (self->peers); item != NULL; item = zhash_next (self->peers)) zyre_node_purge_peer (zhash_cursor (self->peers), item, (char *) endpoint); peer = zyre_peer_new (self->peers, uuid); assert (peer); zyre_peer_set_origin (peer, self->name); zyre_peer_set_verbose (peer, self->verbose); zyre_peer_connect (peer, self->uuid, endpoint, self->expired_timeout); // Handshake discovery by sending HELLO as first message zlist_t *groups = zlist_dup (self->own_groups); zhash_t *headers = zhash_dup (self->headers); zre_msg_t *msg = zre_msg_new (ZRE_MSG_HELLO); zre_msg_set_endpoint (msg, self->endpoint); zre_msg_set_groups (msg, &groups); zre_msg_set_status (msg, self->status); zre_msg_set_name (msg, self->name); zre_msg_set_headers (msg, &headers); zyre_peer_send (peer, &msg); } return peer; }
static zyre_peer_t * zyre_node_require_peer (zyre_node_t *self, zuuid_t *uuid, char *address, uint16_t port) { zyre_peer_t *peer = (zyre_peer_t *) zhash_lookup (self->peers, zuuid_str (uuid)); if (!peer) { // Purge any previous peer on same endpoint char endpoint [100]; snprintf (endpoint, 100, "tcp://%s:%hu", address, port); zhash_foreach (self->peers, zyre_node_purge_peer, endpoint); peer = zyre_peer_new (self->ctx, self->peers, uuid); zyre_peer_connect (peer, self->uuid, endpoint); // Handshake discovery by sending HELLO as first message zre_msg_t *msg = zre_msg_new (ZRE_MSG_HELLO); zre_msg_set_ipaddress (msg, self->host); zre_msg_set_mailbox (msg, self->port); zre_msg_set_groups (msg, zhash_keys (self->own_groups)); zre_msg_set_status (msg, self->status); zre_msg_set_headers (msg, zhash_dup (self->headers)); zyre_peer_send (peer, &msg); // Send new peer event to logger, if any zyre_log_info (self->log, ZRE_LOG_MSG_EVENT_ENTER, zyre_peer_endpoint (peer), endpoint); } return peer; }
int zre_msg_send_hello ( void *output, uint16_t sequence, char *ipaddress, uint16_t mailbox, zlist_t *groups, byte status, zhash_t *headers) { zre_msg_t *self = zre_msg_new (ZRE_MSG_HELLO); zre_msg_set_sequence (self, sequence); zre_msg_set_ipaddress (self, ipaddress); zre_msg_set_mailbox (self, mailbox); zre_msg_set_groups (self, zlist_dup (groups)); zre_msg_set_status (self, status); zre_msg_set_headers (self, zhash_dup (headers)); return zre_msg_send (&self, output); }