int TAO_ECG_Mcast_EH::delete_unwanted_subscriptions ( Address_Set& multicast_addresses) { for (size_t i = 0; i < this->subscriptions_.size (); ++i) { ACE_INET_Addr multicast_group = this->subscriptions_[i].mcast_addr; if (multicast_addresses.find (multicast_group)) { // Remove from the list of subscriptions to be added, // because we already subscribe to it... (void) multicast_addresses.remove (multicast_group); continue; } // This subscription is no longer needed - remove from reactor, // close and delete the socket. ACE_SOCK_Dgram_Mcast *socket = this->subscriptions_[i].dgram; (void) this->reactor ()->remove_handler (socket->get_handle (), ACE_Event_Handler::READ_MASK); (void) socket->close(); delete socket; // Move the deleted subscription out of the <subscriptions_> // array by moving the last subscription in array into its place. this->subscriptions_[i] = this->subscriptions_[this->subscriptions_.size () - 1]; this->subscriptions_.size (this->subscriptions_.size () - 1); --i; } return 0; }
void TAO_ECG_Mcast_EH::add_new_subscriptions (Address_Set& multicast_addresses) { typedef ACE_Unbounded_Set_Iterator<ACE_INET_Addr> Address_Iterator; for (Address_Iterator k = multicast_addresses.begin (); k != multicast_addresses.end (); ++k) { Subscription new_subscription; new_subscription.mcast_addr = *k; ACE_NEW (new_subscription.dgram, ACE_SOCK_Dgram_Mcast); size_t const subscriptions_size = this->subscriptions_.size (); this->subscriptions_.size (subscriptions_size + 1); this->subscriptions_[subscriptions_size] = new_subscription; ACE_SOCK_Dgram_Mcast *socket = new_subscription.dgram; if (socket->open (new_subscription.mcast_addr, this->net_if_, 1) == -1) { ORBSVCS_ERROR ((LM_ERROR, "Error: %d - Unable to open multicast socket\n", ACE_ERRNO_GET)); } if ( socket->enable (ACE_NONBLOCK) != 0 ) { ORBSVCS_ERROR ((LM_ERROR, "Error: %d - Unable to enable nonblocking on mcast_eh\n", ACE_ERRNO_GET)); } if (socket->join (new_subscription.mcast_addr, 1, this->net_if_) == -1) { ORBSVCS_ERROR ((LM_ERROR, "Error: %d - Unable to join multicast group\n", ACE_ERRNO_GET)); } if (this->recvbuf_size_ != 0 && (((ACE_SOCK_Dgram *)socket)->set_option(SOL_SOCKET, SO_RCVBUF, (void *) &this->recvbuf_size_, sizeof (this->recvbuf_size_)) == -1) && errno != ENOTSUP ) { ORBSVCS_ERROR ((LM_ERROR, "Error: %d - Unable to set mcast_eh recvbuf_size:%d\n", ACE_ERRNO_GET, this->recvbuf_size_)); } (void) this->reactor ()->register_handler ( socket->get_handle (), this, ACE_Event_Handler::READ_MASK); } }
int TAO_ECG_Mcast_EH::handle_input (ACE_HANDLE fd) { size_t const subscriptions_size = this->subscriptions_.size (); for (size_t i = 0; i != subscriptions_size; ++i) { ACE_SOCK_Dgram_Mcast *socket = this->subscriptions_[i].dgram; if (socket->get_handle () == fd) { return this->receiver_->handle_input (*socket); } } return -1; }