view src/wifibroadcast/WifiMulticastChannel.java @ 3:9c99e2193277

find broadcast
author one
date Sat, 28 Jul 2012 18:15:13 +0900
parents 2a328333ba70
children 95d58cc5bb0b
line wrap: on
line source

package wifibroadcast;

import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.NetworkInterface;
import java.net.SocketAddress;
import java.net.StandardProtocolFamily;
import java.net.StandardSocketOptions;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.spi.SelectorProvider;

public class WifiMulticastChannel implements WifiReceiver {
	private InetAddress mAddr;
	private DatagramChannel dc;
	private SocketAddress sAddr;
	private Selector selector;

	public WifiMulticastChannel(String mCASTADDR, int port, SocketType sender) throws IOException {
		// join multicast group on this interface, and also use this
		// interface for outgoing multicast datagrams
		selector = SelectorProvider.provider().openSelector();	
		NetworkInterface ni = NetworkInterface.getByName("en1");
		if (ni==null) {
			System.err.println("Can't open network interface "+"en1");
			throw new IOException();
		}

		if (!ni.supportsMulticast()) {
			System.err.println("Network interface does not support multicast"+"en1");
			throw new IOException();
		}

		dc = DatagramChannel.open(StandardProtocolFamily.INET)
				.setOption(StandardSocketOptions.SO_REUSEADDR, true)
				.bind(sAddr = new InetSocketAddress(port))
				.setOption(StandardSocketOptions.IP_MULTICAST_IF, ni);

		mAddr = InetAddress.getByName(mCASTADDR);

		dc.join(mAddr, ni);
		dc.configureBlocking(false);
		dc.register(selector, SelectionKey.OP_READ);
	}

	@Override
	public void recieve(ByteBuffer testData, long timeout) throws IOException {
		if (selector.select(timeout)>0) {
			dc.receive(testData);
		} else {
			testData.limit(0); testData.position(0);
		}
	}

	@Override
	public void send(ByteBuffer testData) throws IOException {
		dc.send(testData, sAddr);
	}

}