/* -*- C++ -*- */ //============================================================================= /** * @file SOCK_Dgram_Mcast.h * * $Id$ * * @author Irfan Pyrali * @author Tim Harrison * @author and Douglas C. Schmidt */ //============================================================================= #ifndef ACE_SOCK_DGRAM_MCAST_H #define ACE_SOCK_DGRAM_MCAST_H #include "ace/pre.h" #include "ace/SOCK_Dgram.h" #if !defined (ACE_LACKS_PRAGMA_ONCE) # pragma once #endif /* ACE_LACKS_PRAGMA_ONCE */ #include "ace/INET_Addr.h" /** * @class ACE_SOCK_Dgram_Mcast * * @brief Defines the member functions for the ACE socket wrapper * for UDP/IP multicast. */ class ACE_Export ACE_SOCK_Dgram_Mcast : public ACE_SOCK_Dgram { public: // = Initialization routine. /** * Note that there is no public method. Therefore, this * class cannot be used unless you to a multicast group. * If you just want to send (and not listen) to a multicast group, * use or instead. */ ACE_SOCK_Dgram_Mcast (void); /// Default dtor. ~ACE_SOCK_Dgram_Mcast (void); // = Multicast group management routines. /** * This is a BSD-style method (i.e., no QoS) for joining a multicast * group. The network interface device driver is instructed to * accept datagrams with multicast addresses. If the * socket has already been opened, closes the socket and * opens a new socket bound to the . * * The interface is hardware specific, e.g., use "netstat * -i" to find whether your interface is, such as "le0" or something * else. If net_if == 0, uses the default mcast * interface. Returns: -1 if the call fails. * * Note that some platforms, such as pSoS, support only number, not * names, for network interfaces. For these platforms, just give * these numbers in alphanumeric form and will convert * them into numbers via . */ int subscribe (const ACE_INET_Addr &mcast_addr, int reuse_addr = 1, const ACE_TCHAR *net_if = 0, int protocol_family = PF_INET, int protocol = 0); /** * Leave a multicast group identified by . The * interface is hardware specific. Use something like "netstat -i" * to find whether your interface is, such as "le0" or something * else. If == 0, uses the default mcast * interface. Returns: -1 if the call fails. * * Note that some platforms, such as pSoS, support only number, not * names, for network interfaces. For these platforms, just give * these numbers in alphanumeric form and will convert * them into numbers via . */ int unsubscribe (const ACE_INET_Addr &mcast_addr, const ACE_TCHAR *net_if = 0, int protocol_family = PF_INET, int protocol = 0); /// Unsubscribe from a multicast group. Returns -1 if the call /// fails. int unsubscribe (void); // = Data transfer routines. /// Send bytes in . ssize_t send (const void *buf, size_t n, int flags = 0) const; /// Send . ssize_t send (const iovec iov[], size_t n, int flags = 0) const; // = Options. /** * Set an ip option that takes a char as input, such as * or . This is just a more * concise nice interface to a subset of possible * calls. Returns 0 on success, -1 on * failure. */ int set_option (int option, char optval); /// Dump the state of an object. void dump (void) const; /// Declare the dynamic allocation hooks. ACE_ALLOC_HOOK_DECLARE; private: // = Disable public method to ensure class used properly. /// Not publically visible. int open (const ACE_Addr &mcast_addr, int protocol_family = PF_INET, int protocol = 0, int reuse_addr = 0); /// Not publically visible. int open (const ACE_Addr &mcast_addr, const ACE_QoS_Params &qos_params, int protocol_family = PF_INET, int protocol = 0, ACE_Protocol_Info *protocolinfo = 0, ACE_SOCK_GROUP g = 0, u_long flags = 0, int reuse_addr = 0); /// Subscribe to the multicast interface using BSD-style semantics /// (no QoS). int subscribe_ifs (const ACE_INET_Addr &mcast_addr, const ACE_TCHAR *net_if, int protocol_family, int protocol, int reuse_addr); /// Unsubscribe to multicast interfaces subscribed to previously by /// . int unsubscribe_ifs (const ACE_INET_Addr &mcast_addr, const ACE_TCHAR *net_if = 0, int protocol_family = PF_INET, int protocol = 0); // = Disable public use of s // This forces s inline. ssize_t send (const void *buf, size_t n, const ACE_Addr &addr, int flags = 0) const; ssize_t send (const iovec iov[], size_t n, const ACE_Addr &addr, int flags = 0) const; protected: /// Initialize the IP address. int make_multicast_address (const ACE_INET_Addr &mcast_addr, const ACE_TCHAR *net_if = ACE_LIB_TEXT ("le0")); /// Initialize a multicast address. This method factors out common /// code called by and . int make_multicast_address_i (const ACE_INET_Addr &mcast_addr, ip_mreq& multicast_address, const ACE_TCHAR *net_if = ACE_LIB_TEXT ("le0")); /// A copy of the address that we use to multicasts. ACE_INET_Addr mcast_addr_; /// IP address of the interface upon which we're receiving /// multicasts. ip_mreq mcast_request_if_; }; #if !defined (ACE_LACKS_INLINE_FUNCTIONS) #include "ace/SOCK_Dgram_Mcast.i" #endif /* ACE_LACKS_INLINE_FUNCTIONS */ #include "ace/post.h" #endif /* ACE_SOCK_DGRAM_MCAST_H */