diff options
Diffstat (limited to 'ace/SOCK_Dgram_Bcast.cpp')
-rw-r--r-- | ace/SOCK_Dgram_Bcast.cpp | 242 |
1 files changed, 0 insertions, 242 deletions
diff --git a/ace/SOCK_Dgram_Bcast.cpp b/ace/SOCK_Dgram_Bcast.cpp deleted file mode 100644 index 641bb3788c7..00000000000 --- a/ace/SOCK_Dgram_Bcast.cpp +++ /dev/null @@ -1,242 +0,0 @@ -// SOCK_Dgram_Bcast.cpp -// $Id$ - - -#define ACE_BUILD_DLL -#include "ace/SOCK_Dgram_Bcast.h" - -ACE_ALLOC_HOOK_DEFINE(ACE_SOCK_Dgram_Bcast) - -ACE_Bcast_Node::ACE_Bcast_Node (ACE_INET_Addr &addr, - ACE_Bcast_Node *next) - : bcast_addr_ (addr), - next_ (next) -{ - ACE_TRACE ("ACE_Bcast_Node::ACE_Bcast_Node"); -} - -void -ACE_SOCK_Dgram_Bcast::dump (void) const -{ - ACE_TRACE ("ACE_SOCK_Dgram_Bcast::dump"); -} - -// Close up and release resources. - -int -ACE_SOCK_Dgram_Bcast::close (void) -{ - ACE_TRACE ("ACE_SOCK_Dgram_Bcast::close"); - - ACE_Bcast_Node *temp = this->if_list_; - - // Release the dynamically allocated memory. - while (temp != 0) - { - ACE_Bcast_Node *hold = temp->next_; - delete temp; - temp = hold; - } - - // Shut down the descriptor. - return ACE_SOCK::close (); -} - -// Here's the simple-minded constructor. - -ACE_SOCK_Dgram_Bcast::ACE_SOCK_Dgram_Bcast (void) - : if_list_ (0) -{ - ACE_TRACE ("ACE_SOCK_Dgram_Bcast::ACE_SOCK_Dgram_Bcast"); -} - -// Here's the general-purpose constructor used by a connectionless -// datagram ``server''... - -ACE_SOCK_Dgram_Bcast::ACE_SOCK_Dgram_Bcast (const ACE_Addr &local, - int protocol_family, - int protocol) - : ACE_SOCK_Dgram (local, protocol_family, protocol), - if_list_ (0) -{ - ACE_TRACE ("ACE_SOCK_Dgram_Bcast::ACE_SOCK_Dgram_Bcast"); - - if (this->mk_broadcast () == -1) - ACE_ERROR ((LM_ERROR, "%p\n", "ACE_SOCK_Dgram_Bcast")); -} - -// Here's the general-purpose open routine. - -int -ACE_SOCK_Dgram_Bcast::open (const ACE_Addr &local, - int protocol_family, - int protocol) -{ - ACE_TRACE ("ACE_SOCK_Dgram_Bcast::open"); - if (this->ACE_SOCK_Dgram::open (local, protocol_family, - protocol) == -1) - return -1; - - return this->mk_broadcast (); -} - -// Make broadcast available for Datagram socket. - -int -ACE_SOCK_Dgram_Bcast::mk_broadcast (void) -{ - ACE_TRACE ("ACE_SOCK_Dgram_Bcast::mk_broadcast"); - - int one = 1; - - if (ACE_OS::setsockopt (this->get_handle (), SOL_SOCKET, SO_BROADCAST, - (char *) &one, sizeof one) == -1) - return -1; - -#if !defined(ACE_WIN32) - char buf[BUFSIZ]; - struct ifconf ifc; - struct ifreq *ifr; - - struct ifreq flags; - struct ifreq if_req; - - int s = this->get_handle (); - - ifc.ifc_len = sizeof buf; - ifc.ifc_buf = buf; - - // Get interface structure and initialize the addresses using UNIX techniques. - if (ACE_OS::ioctl (s, SIOCGIFCONF, (char *) &ifc) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "%p\n", - "ACE_SOCK_Dgram_Bcast::mk_broadcast: ioctl (get interface configuration)"), - ACE_INVALID_HANDLE); - - ifr = ifc.ifc_req; - - for (int n = ifc.ifc_len / sizeof (struct ifreq) ; n > 0; n--, ifr++) - { - - if (ifr->ifr_addr.sa_family != AF_INET) - { - ACE_ERROR ((LM_ERROR, "%p\n", "ACE_SOCK_Dgram_Bcast::mk_broadcast: Not AF_INET")); - continue; - } - - flags = if_req = *ifr; - - if (ACE_OS::ioctl (s, SIOCGIFFLAGS, (char *) &flags) == -1) - { - ACE_ERROR ((LM_ERROR, "%p\n", - "ACE_SOCK_Dgram_Bcast::mk_broadcast: ioctl (get interface flags)")); - continue; - } - - if (ACE_BIT_ENABLED (flags.ifr_flags, IFF_UP) == 0) - { - ACE_ERROR ((LM_ERROR, "%p\n", - "ACE_SOCK_Dgram_Bcast::mk_broadcast: Network interface is not up")); - continue; - } - - if (ACE_BIT_ENABLED (flags.ifr_flags, IFF_LOOPBACK)) - continue; - - if (ACE_BIT_ENABLED (flags.ifr_flags, IFF_BROADCAST)) - { - if (ACE_OS::ioctl (s, SIOCGIFBRDADDR, (char *) &if_req) == -1) - ACE_ERROR ((LM_ERROR, "%p\n", - "ACE_SOCK_Dgram_Bcast::mk_broadcast: ioctl (get broadaddr)")); - else - { - ACE_INET_Addr addr ((sockaddr_in *) &if_req.ifr_broadaddr, - sizeof if_req.ifr_broadaddr); - ACE_NEW_RETURN (this->if_list_, ACE_Bcast_Node (addr, this->if_list_), -1); - } - } - else - ACE_ERROR ((LM_ERROR, "%p\n", - "ACE_SOCK_Dgram_Bcast::mk_broadcast: Broadcast is not enable for this interface.")); - } -#else - ACE_INET_Addr addr (u_short (0), ACE_UINT32 (INADDR_BROADCAST)); - ACE_NEW_RETURN (this->if_list_, ACE_Bcast_Node (addr, this->if_list_), -1); -#endif /* !ACE_WIN32 */ - return this->if_list_ == 0 ? -1 : 0; -} - -// Broadcast the datagram to every interface. Returns the average -// number of bytes sent. - -ssize_t -ACE_SOCK_Dgram_Bcast::send (const void *buf, - size_t n, - u_short port_number, - int flags) const -{ - ACE_TRACE ("ACE_SOCK_Dgram_Bcast::send"); - size_t iterations = 0; - ssize_t total_bytes = 0; - - if (this->if_list_ == 0) - return -1; - - for (ACE_Bcast_Node *temp = this->if_list_; - temp != 0; - temp = temp->next_) - { - temp->bcast_addr_.set_port_number (port_number); - - ssize_t bytes_sent = ACE_SOCK_Dgram::send (buf, n, - temp->bcast_addr_, - flags); - - if (bytes_sent == -1) - return -1; - else - total_bytes += bytes_sent; - - iterations++; - } - - return iterations == 0 ? 0 : total_bytes / iterations; -} - -#if defined (ACE_HAS_MSG) -// Broadcast datagram to every interfaces. - -ssize_t -ACE_SOCK_Dgram_Bcast::send (const iovec iov[], - size_t n, - u_short /* port_number */, - int flags) const -{ - ACE_TRACE ("ACE_SOCK_Dgram_Bcast::send"); - - if (this->if_list_ == 0) - return -1; - - // Send the message to every interface. - - for (ACE_Bcast_Node *temp = this->if_list_; temp != 0; temp++) - if (ACE_SOCK_Dgram::send (iov, n, temp->bcast_addr_, flags) == -1) - return -1; - - return 0; -} - -// Broadcast an ACE_IO_Vector of size N to ADDR as a datagram (note -// that addr must be preassigned to the broadcast address of the -// subnet...). - -ssize_t -ACE_SOCK_Dgram_Bcast::send (const iovec iov[], - size_t n, - const ACE_Addr &addr, - int flags) const -{ - ACE_TRACE ("ACE_SOCK_Dgram_Bcast::send"); - - return ACE_SOCK_Dgram::send (iov, n, addr, flags); -} -#endif /* ACE_HAS_MSG */ |