nidas  v1.2-1520
Public Member Functions | Protected Attributes | List of all members
nidas::util::MulticastSocket Class Reference

A datagram socket to be used for multicasts. More...

#include <Socket.h>

Inheritance diagram for nidas::util::MulticastSocket:
Inheritance graph
[legend]

Public Member Functions

 MulticastSocket () throw (IOException)
 Create an unbound multicast socket. More...
 
 MulticastSocket (int port) throw (IOException)
 Create multicast socket, bind it to a local port. More...
 
 throw (IOException)
 Creates a datagram socket and binds it to the specified local address. More...
 
void joinGroup (Inet4Address groupAddr) throw (IOException)
 Join a multicast group on all interfaces. More...
 
void joinGroup (Inet4Address groupAddr, const Inet4NetworkInterface &iface) throw (IOException)
 Join a multicast group on a given interface. More...
 
void leaveGroup (Inet4Address groupAddr) throw (IOException)
 Leave a multicast group on all interfaces. More...
 
void leaveGroup (Inet4Address groupAddr, const Inet4NetworkInterface &iface) throw (IOException)
 Leave a multicast group on a given interface. More...
 
void setTimeToLive (int val) throw (IOException)
 
int getTimeToLive () const throw (IOException)
 
void setMulticastLoop (bool val) throw (IOException)
 Whether to set the IP_MULTICAST_LOOP socket option. More...
 
bool getMulticastLoop () const throw (IOException)
 
void setInterface (Inet4Address maddr, const Inet4NetworkInterface &iface) throw (IOException)
 Set the interface for a given multicast address. More...
 
void setInterface (Inet4Address iaddr) throw (IOException)
 Set the interface for a given multicast address. More...
 
Inet4NetworkInterface getInterface () const throw (IOException)
 
Inet4NetworkInterface findInterface (const Inet4Address &iaddr) const throw (IOException)
 
std::list< Inet4NetworkInterfacegetInterfaces () const throw (IOException)
 Return the IP addresses of all my network interfaces. More...
 
void close () throw (IOException)
 
void setTimeout (int val)
 Set the timeout for receive(), recv(), and recvfrom() methods. More...
 
void connect (const std::string &host, int port) throw (UnknownHostException,IOException)
 Datagrams are connectionless, so this doesn't establish a true connection, it just sets the default destination address for the send() calls. More...
 
void connect (const Inet4Address &addr, int port) throw (IOException)
 Datagrams are connectionless, so this doesn't establish a true connection, it just sets the default destination address for the send() calls. More...
 
void connect (const SocketAddress &addr) throw (IOException)
 Datagrams are connectionless, so this doesn't establish a true connection, it just sets the default destination address for the send() calls. More...
 
void bind (const Inet4Address &addr, int port) throw (IOException)
 Bind the DatagramSocket to the specified local address. More...
 
void bind (const SocketAddress &addr) throw (IOException)
 Bind the DatagramSocket to the specified local address. More...
 
int getFd () const
 
void receive (DatagramPacketBase &packet) throw (IOException)
 Read a packet from the DatagramSocket. More...
 
void receive (DatagramPacketBase &packet, Inet4PacketInfo &info, int flags=0) throw (IOException)
 Read a packet from the DatagramSocket. More...
 
void send (const DatagramPacketBase &packet, int flags=0) throw (IOException)
 
size_t send (const void *buf, size_t len, int flags=0) throw (IOException)
 
size_t send (const struct iovec *iov, int iovcnt, int flags=MSG_NOSIGNAL) throw (IOException)
 
size_t recv (void *buf, size_t len, int flags=0) throw (IOException)
 
size_t recvfrom (void *buf, size_t len, int flags, SocketAddress &from) throw (IOException)
 
size_t sendto (const void *buf, size_t len, int flags, const SocketAddress &to) throw (IOException)
 
size_t sendto (const struct iovec *iov, int iovcnt, int flags, const SocketAddress &to) throw (IOException)
 
const SocketAddressgetLocalSocketAddress () const throw ()
 Get local address of this socket. More...
 
int getLocalPort () const throw ()
 Get local port number of this socket. More...
 
void setNonBlocking (bool val) throw (IOException)
 Do fcntl system call to set O_NONBLOCK file descriptor flag on the socket. More...
 
bool isNonBlocking () const throw (IOException)
 
void setReceiveBufferSize (int size) throw (IOException)
 
int getReceiveBufferSize () throw (IOException)
 
void setSendBufferSize (int size) throw (IOException)
 
int getSendBufferSize () throw (IOException)
 
void setBroadcastEnable (bool val) throw (IOException)
 
bool getBroadcastEnable () const throw (IOException)
 
void setPktInfo (bool val) throw (IOException)
 Control whether a IP_PKTINFO ancillary message is received with each datagram. More...
 

Protected Attributes

SocketImpl _impl
 

Detailed Description

A datagram socket to be used for multicasts.

This class provides the default public copy constructors and assignment operators. Objects of this class can be copied and assigned to without restriction. However, because of this, the destructor does not close the socket, so, in general, you should make sure that the socket is closed once at some point.

Usage example:

// host A listens for multicasts to address 239.0.0.1, port 9000:
MulticastSocket msock(9000);
// join the multicast group in whatever interface the system chooses,
// typically the first ethernet interface.
msock.joinGroup(Inet4Address::getByName("239.0.0.1"));
char buf[512];
Inet4SocketAddress from;
for (;;) {
msock.recvfrom(buf,sizeof(buf),0,from);
...
}
// how to join on all multicast and loopback interfaces
// note that multicast works over the loopback interface
list<Inet4NetworkInterface> ifaces = msock.getInterfaces();
for (list<Inet4NetworkInterface>::const_iterator ii = ifaces.begin();
ii != ifaces.end(); ++ii)
{
if ((ii->getFlags() & (IFF_LOOPBACK | IFF_MULTICAST)) && (ii->getFlags() & IFF_UP))
msock.joinGroup(Inet4Address::getByName("239.0.0.1"),*ii);
}
// host B multicasts to address 239.0.0.1, port 9000:
Inet4Address maddr = Inet4Address::getByName("239.0.0.1");
Inet4SocketAddress msaddr = Inet4SocketAddress(maddr,9000);
for (;;) {
msock.sendto("hello\n",6,0,msaddr);
...
}
// host C also does similar multicasts, but uses MulticastSocket
// methods to send packets out a specific interface, and
// to set the time to live (TTL) parameter.
Inet4Address maddr = Inet4Address::getByName("239.0.0.1");
list<Inet4NetworkInterfaces> ifaces = msock.getInterfaces();
list<Inet4NetworkInterfaces>::const_iterator ii;
for (ii = ifaces.begin(); ii != ifaces.end(); ++ii) {
Inet4NetworkInterface ni = *ii;
if (ni.getName() == "eth1")
msock.setInterface(maddr,ni);
}
msock.setTimeToLive(2); // go through one router
Inet4SocketAddress msaddr = Inet4SocketAddress(maddr,9000);
for (;;) {
msock.sendto("hello\n",6,0,msaddr);
...
}

Note: if the above examples are not working for you, check your firewall settings. They might be blocking multicasts.

Constructor & Destructor Documentation

nidas::util::MulticastSocket::MulticastSocket ( )
throw (IOException
)
inline

Create an unbound multicast socket.

You must bind it to a port if you want to receive packets. If you are sending packets on this MulticastSocket, and do not use getInterfaces() and setInterface() to choose a specific interface, the system sends packets out on the first non-loopback interface that it finds. If a firewall is blocking multicast packets on that interface the packets won't be sent.

nidas::util::MulticastSocket::MulticastSocket ( int  port)
throw (IOException
)
inline

Create multicast socket, bind it to a local port.

Member Function Documentation

void nidas::util::DatagramSocket::bind ( const Inet4Address addr,
int  port 
)
throw (IOException
)
inlineinherited

Bind the DatagramSocket to the specified local address.

The address should correspond to the address of a local interface. Only packets sent to the given port and interface, by unicast, broadcast or multicast will be received.

Referenced by nidas::core::DatagramSocket::connect(), and nidas::core::DerivedDataReader::run().

void nidas::util::DatagramSocket::bind ( const SocketAddress addr)
throw (IOException
)
inlineinherited

Bind the DatagramSocket to the specified local address.

The address should correspond to the address of a local interface. Only packets sent to the given port and interface, by unicast, broadcast or multicast will be received.

void nidas::util::DatagramSocket::close ( )
throw (IOException
)
inlineinherited
void nidas::util::DatagramSocket::connect ( const std::string &  host,
int  port 
)
throw (UnknownHostException,
IOException
)
inlineinherited

Datagrams are connectionless, so this doesn't establish a true connection, it just sets the default destination address for the send() calls.

Referenced by nidas::core::DatagramSocket::connect(), and nidas::util::McSocketListener::run().

void nidas::util::DatagramSocket::connect ( const Inet4Address addr,
int  port 
)
throw (IOException
)
inlineinherited

Datagrams are connectionless, so this doesn't establish a true connection, it just sets the default destination address for the send() calls.

void nidas::util::DatagramSocket::connect ( const SocketAddress addr)
throw (IOException
)
inlineinherited

Datagrams are connectionless, so this doesn't establish a true connection, it just sets the default destination address for the send() calls.

Inet4NetworkInterface nidas::util::MulticastSocket::findInterface ( const Inet4Address iaddr) const
throw (IOException
)
inline
bool nidas::util::DatagramSocket::getBroadcastEnable ( ) const
throw (IOException
)
inlineinherited
int nidas::util::DatagramSocket::getFd ( ) const
inlineinherited
Inet4NetworkInterface nidas::util::MulticastSocket::getInterface ( ) const
throw (IOException
)
inline
std::list<Inet4NetworkInterface> nidas::util::MulticastSocket::getInterfaces ( ) const
throw (IOException
)
inline
int nidas::util::DatagramSocket::getLocalPort ( ) const
throw (
)
inlineinherited

Get local port number of this socket.

Referenced by nidas::core::StatusListener::run(), and nidas::util::McSocketMulticaster< SocketTT >::run().

const SocketAddress& nidas::util::DatagramSocket::getLocalSocketAddress ( ) const
throw (
)
inlineinherited
bool nidas::util::MulticastSocket::getMulticastLoop ( ) const
throw (IOException
)
inline
int nidas::util::DatagramSocket::getReceiveBufferSize ( )
throw (IOException
)
inlineinherited
int nidas::util::DatagramSocket::getSendBufferSize ( )
throw (IOException
)
inlineinherited
int nidas::util::MulticastSocket::getTimeToLive ( ) const
throw (IOException
)
inline
bool nidas::util::DatagramSocket::isNonBlocking ( ) const
throw (IOException
)
inlineinherited
void nidas::util::MulticastSocket::joinGroup ( Inet4Address  groupAddr)
throw (IOException
)
inline

Join a multicast group on all interfaces.

Referenced by nidas::core::UDPSocketIODevice::open(), and nidas::core::StatusListener::run().

void nidas::util::MulticastSocket::joinGroup ( Inet4Address  groupAddr,
const Inet4NetworkInterface iface 
)
throw (IOException
)
inline

Join a multicast group on a given interface.

void nidas::util::MulticastSocket::leaveGroup ( Inet4Address  groupAddr)
throw (IOException
)
inline

Leave a multicast group on all interfaces.

void nidas::util::MulticastSocket::leaveGroup ( Inet4Address  groupAddr,
const Inet4NetworkInterface iface 
)
throw (IOException
)
inline

Leave a multicast group on a given interface.

void nidas::util::DatagramSocket::receive ( DatagramPacketBase packet)
throw (IOException
)
inlineinherited

Read a packet from the DatagramSocket.

On return, packet.getLength() will contain the number bytes received, and packet.getSocketAddress() will contain the address of the sender.

Referenced by PacketReader::loop(), nidas::core::DerivedDataReader::run(), nidas::util::McSocketListener::run(), and nidas::util::McSocketMulticaster< SocketTT >::run().

void nidas::util::DatagramSocket::receive ( DatagramPacketBase packet,
Inet4PacketInfo info,
int  flags = 0 
)
throw (IOException
)
inlineinherited

Read a packet from the DatagramSocket.

On return, packet.getLength() will contain the number bytes received, and packet.getSocketAddress() will contain the address of the sender. info will contain the information on the local and destination addresses of the packet, and the interface it was received on. If setPktInfo(true) has not be set on this socket, then it is set prior to receiving the packet, and then unset after receipt of the packet.

size_t nidas::util::DatagramSocket::recv ( void *  buf,
size_t  len,
int  flags = 0 
)
throw (IOException
)
inlineinherited
size_t nidas::util::DatagramSocket::recvfrom ( void *  buf,
size_t  len,
int  flags,
SocketAddress from 
)
throw (IOException
)
inlineinherited

References len.

Referenced by nidas::core::StatusListener::run().

void nidas::util::DatagramSocket::send ( const DatagramPacketBase packet,
int  flags = 0 
)
throw (IOException
)
inlineinherited
size_t nidas::util::DatagramSocket::send ( const void *  buf,
size_t  len,
int  flags = 0 
)
throw (IOException
)
inlineinherited
size_t nidas::util::DatagramSocket::send ( const struct iovec *  iov,
int  iovcnt,
int  flags = MSG_NOSIGNAL 
)
throw (IOException
)
inlineinherited
size_t nidas::util::DatagramSocket::sendto ( const void *  buf,
size_t  len,
int  flags,
const SocketAddress to 
)
throw (IOException
)
inlineinherited
size_t nidas::util::DatagramSocket::sendto ( const struct iovec *  iov,
int  iovcnt,
int  flags,
const SocketAddress to 
)
throw (IOException
)
inlineinherited
void nidas::util::DatagramSocket::setBroadcastEnable ( bool  val)
throw (IOException
)
inlineinherited
void nidas::util::MulticastSocket::setInterface ( Inet4Address  maddr,
const Inet4NetworkInterface iface 
)
throw (IOException
)
inline

Set the interface for a given multicast address.

If you are sending packets on this MulticastSocket, and do not use setInterface() specific interface, the system will send packets out on the first interface that it finds that is capable of MULTICAST. See setInterface(Inet4Address maddr);

If there are no multicast interfaces that are UP, then the system may not choose the loopback interface by default. So doing multicast on a DHCP laptop that isn't connected to the net may give problems.

Referenced by nidas::core::MultipleUDPSockets::addClient(), nidas::core::DSMServerStat::run(), and nidas::util::McSocketMulticaster< SocketTT >::run().

void nidas::util::MulticastSocket::setInterface ( Inet4Address  iaddr)
throw (IOException
)
inline

Set the interface for a given multicast address.

This uses the default value of INADDR_ANY for the specific interface, which causes the system to choose what it thinks is the most appropriate interface, typically the first ethernet interface on the system. If you have more than one candidate interface, you can add an entry in the routing table to indicate which you want to use: route add -host 239.0.0.10 dev eth1

void nidas::util::MulticastSocket::setMulticastLoop ( bool  val)
throw (IOException
)
inline

Whether to set the IP_MULTICAST_LOOP socket option.

According to "man 7 ip", IP_MULTICAST_LOOP controls "whether sent multicast packets should be looped back to the local sockets." This is the default in Linux in that setting it does not seem to be necessary for a process on a host to receive multicast packets that are sent out on one of its interfaces, providing the multicast reader has joined that interface, and a firewall is not blocking them (a source of frustration!).

Referenced by nidas::core::MultipleUDPSockets::addClient().

void nidas::util::DatagramSocket::setNonBlocking ( bool  val)
throw (IOException
)
inlineinherited

Do fcntl system call to set O_NONBLOCK file descriptor flag on the socket.

Parameters
valtrue=set O_NONBLOCK, false=unset O_NONBLOCK.

Referenced by nidas::core::DatagramSocket::connect(), nidas::core::McSocketUDP::connect(), nidas::core::McSocketUDP::connected(), and nidas::core::DatagramSocket::setNonBlocking().

void nidas::util::DatagramSocket::setPktInfo ( bool  val)
throw (IOException
)
inlineinherited

Control whether a IP_PKTINFO ancillary message is received with each datagram.

Only supported on DatagramSockets. The IP_PKTINFO message is converted to an Inet4PacketInfo object which is available via the getInet4PacketInfo() method.

Parameters
val,:if true enable the IP_PKTINFO message, if false, disable.
void nidas::util::DatagramSocket::setReceiveBufferSize ( int  size)
throw (IOException
)
inlineinherited
void nidas::util::DatagramSocket::setSendBufferSize ( int  size)
throw (IOException
)
inlineinherited
void nidas::util::DatagramSocket::setTimeout ( int  val)
inlineinherited

Set the timeout for receive(), recv(), and recvfrom() methods.

Parameters
valtimeout in milliseconds. 0=no timeout (infinite) The receive methods will return IOTimeoutException if an operation times out.
void nidas::util::MulticastSocket::setTimeToLive ( int  val)
throw (IOException
)
inline
nidas::util::MulticastSocket::throw ( IOException  )
inline

Creates a datagram socket and binds it to the specified local address.

Member Data Documentation

SocketImpl nidas::util::DatagramSocket::_impl
protectedinherited

The documentation for this class was generated from the following file: