package com.limegroup.gnutella;
import java.io.IOException;
import java.net.InetAddress;
import java.net.MulticastSocket;
import com.limegroup.gnutella.messages.Message;
/**
* Defines an interface for sending and receiving multicast messages.
* Currently, this only listens for messages from the Multicast group.
* Sending is done on the GUESS port, so that other nodes can reply
* appropriately to the individual request, instead of multicasting
* replies to the whole group.
*
* @see UDPService
* @see MessageRouter
*/
public interface MulticastService {
/**
* Starts the Multicast service.
*/
public void start();
/**
* Returns a new MulticastSocket that is bound to the given port. This
* value should be passed to setListeningSocket(MulticastSocket) to commit
* to the new port. If setListeningSocket is NOT called, you should close
* the return socket.
* @return a new MulticastSocket that is bound to the specified port.
* @exception IOException Thrown if the MulticastSocket could not be
* created.
*/
public MulticastSocket newListeningSocket(int port, InetAddress group) throws IOException;
/**
* Changes the MulticastSocket used for sending/receiving.
* This must be common among all instances of LimeWire on the subnet.
* It is not synched with the typical gnutella port, because that can
* change on a per-servent basis.
* Only MulticastService should mutate this.
* @param multicastSocket the new listening socket, which must be be the
* return value of newListeningSocket(int). A value of null disables
* Multicast sending and receiving.
*/
public void setListeningSocket(MulticastSocket multicastSocket);
/**
* Sends the <tt>Message</tt> using UDPService to the multicast
* address/port.
*
* @param msg the <tt>Message</tt> to send
*/
public void send(Message msg);
/**
* Returns whether or not the Multicast socket is listening for incoming
* messsages.
*
* @return <tt>true</tt> if the Multicast socket is listening for incoming
* Multicast messages, <tt>false</tt> otherwise
*/
public boolean isListening();
}