/*************************************************
 * Author: 	Evelyn Lai-Tee Cheok
 *			Department of Electrical Engineering
 *			Center for Telecommunications Research
 *			Schapiro Research Building
 *			Columbia University
 *
 * Email: 	laitee@ctr.columbia.edu
 *
 **************************************************/
import sun.net.*;
import java.net.*;
import java.lang.*;

/** Class implements receiver multicast socket based on sun.net.MulticastSocket
	Provides a constructor and a function to receive datagram packets over
	the multicast socket **/
	
public class ReceiverMCSocket {
	MulticastSocket receiverSock;
	InetAddress receiverMCAddr;
	int receiverPort;
	DatagramPacket receiverPkt;
	byte buf[] = new byte[1024];

	/** constructor which accepts multicast address (in String format)
		and specified port number. Function creates the receiver
		multicast socket (based on sun.net.MutlicastSocket), converts
		multicast address from String to InetAddress type and joins
		multicast group. **/
	public ReceiverMCSocket(String mcAddr, int port) {
		receiverPort = port;

		try {
			receiverMCAddr = InetAddress.getByName(mcAddr);
		} catch (java.net.UnknownHostException e) {
            System.out.println("failaed to create receiverMCAddr: "+e);
		}

        try {
            receiverSock = new MulticastSocket(receiverPort);
        } catch (java.net.SocketException e) {
            System.out.println("failaed to create receiverSock: "+e);
        } catch (java.io.IOException e) {
            System.out.println("IOException,failed to join multicast group: "+e);
		}

        try {
            receiverSock.joinGroup(receiverMCAddr);
		} catch (java.net.SocketException e) {
            System.out.println("failed to join multicast group: "+e);
        } catch (java.io.IOException e) {
            System.out.println("IOException,failed to join multicast group: "+e);
		}

	}

	/** returns datagram packet received via multicast socket **/
	public DatagramPacket receiveData(byte[] buf) {
		receiverPkt = new DatagramPacket(buf, buf.length);
		try {
			receiverSock.receive(receiverPkt);
		} catch (java.io.IOException e) {
            System.out.println("failed to receive receiverPkt: "+e);
			return (null);
		}
		return (receiverPkt);
	}

}
		

