static void s_self_handle_udp (self_t *self) { assert (self); char peername [INET_ADDRSTRLEN]; zframe_t *frame = zsys_udp_recv (self->udpsock, peername, INET_ADDRSTRLEN); // If filter is set, check that beacon matches it bool is_valid = false; if (self->filter) { byte *filter_data = zframe_data (self->filter); size_t filter_size = zframe_size (self->filter); if (zframe_size (frame) >= filter_size && memcmp (zframe_data (frame), filter_data, filter_size) == 0) is_valid = true; } // If valid, discard our own broadcasts, which UDP echoes to us if (is_valid && self->transmit) { byte *transmit_data = zframe_data (self->transmit); size_t transmit_size = zframe_size (self->transmit); if (zframe_size (frame) == transmit_size && memcmp (zframe_data (frame), transmit_data, transmit_size) == 0) is_valid = false; } // If still a valid beacon, send on to the API if (is_valid) { zmsg_t *msg = zmsg_new (); assert (msg); zmsg_addstr (msg, peername); zmsg_append (msg, &frame); zmsg_send (&msg, self->pipe); } else zframe_destroy (&frame); }
/// // Receive zframe from UDP socket, and set address of peer that sent it // The peername must be a char [INET_ADDRSTRLEN] array if IPv6 is disabled or // NI_MAXHOST if it's enabled. Returns NULL when failing to get peer address. // *** This is for CZMQ internal use only and may change arbitrarily *** QmlZframe *QmlZsysAttached::udpRecv (SOCKET udpsock, const QString &peername, int peerlen) { QmlZframe *retQ_ = new QmlZframe (); retQ_->self = zsys_udp_recv (udpsock, peername.toUtf8().data(), peerlen); return retQ_; };
/// // Receive zframe from UDP socket, and set address of peer that sent it // The peername must be a char [INET_ADDRSTRLEN] array if IPv6 is disabled or // NI_MAXHOST if it's enabled. Returns NULL when failing to get peer address. // *** This is for CZMQ internal use only and may change arbitrarily *** QZframe * QZsys::udpRecv (SOCKET udpsock, const QString &peername, int peerlen) { QZframe *rv = new QZframe (zsys_udp_recv (udpsock, peername.toUtf8().data(), peerlen)); return rv; }