# HG changeset patch # User one # Date 1343471614 -32400 # Node ID 404778ac3f5583754a38e154bd352b1151d6db9f # Parent 9c99e219327752d3831695cf1bbf174027c1316f worked. Broadcast, Multicast, Multicast channel. diff -r 9c99e2193277 -r 404778ac3f55 src/wifibroadcast/WifiBroadcast.java --- a/src/wifibroadcast/WifiBroadcast.java Sat Jul 28 18:15:13 2012 +0900 +++ b/src/wifibroadcast/WifiBroadcast.java Sat Jul 28 19:33:34 2012 +0900 @@ -2,71 +2,65 @@ import java.net.NetworkInterface; import java.io.IOException; +import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.InterfaceAddress; import java.net.SocketException; -import java.net.StandardSocketOptions; +import java.net.UnknownHostException; 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; import java.util.Enumeration; -import java.util.Iterator; public class WifiBroadcast implements WifiReceiver { - private DatagramChannel channel; - private Selector selector; private DatagramSocket s; + private int port; + private InetAddress mAddr; public WifiBroadcast(int port, SocketType sender) throws IOException { - selector = SelectorProvider.provider().openSelector(); - channel = SelectorProvider.provider().openDatagramChannel(); - s = channel.socket(); - channel.setOption(StandardSocketOptions.SO_REUSEADDR, true); - channel.configureBlocking(false); + this.port = port; + if (sender == SocketType.Sender) { - s.setBroadcast(true); try { InetAddress address0 = getBroadcast(); System.out.println("Found broadcast "+address0); - InetSocketAddress address = new InetSocketAddress(address0, port); - channel.connect(address); + mAddr = address0; + s = new DatagramSocket(); + s.bind(new InetSocketAddress(address0,port+1)); + s.setBroadcast(true); } catch (SocketException e) { - // for some bad IPv6 implementation - channel.connect(new InetSocketAddress(port)); } } else { - try { - InetSocketAddress address = new InetSocketAddress("::", port); - channel.connect(address); - } catch (SocketException e) { - // for some bad IPv6 implementation - channel.connect(new InetSocketAddress(port)); - } + // InetAddress address0 = getBroadcast(); + s = new DatagramSocket(port); + // s.bind(new InetSocketAddress(address0,port)); + s.setReuseAddress(true); + s.setBroadcast(true); } - channel.register(selector, SelectionKey.OP_READ); } public void recieve(ByteBuffer testData, long timeout) throws IOException { - if (selector.select(timeout)>0) { - for (Iterator it = selector.selectedKeys().iterator();it.hasNext(); ) { - SelectionKey s = it.next(); - it.remove(); - DatagramChannel ch = (DatagramChannel)s.channel(); - ch.read(testData); - testData.flip(); - return; // one at a time - } - } else { - System.out.println("receiver time out"); - testData.position(0); testData.limit(0); - } + DatagramPacket packet = new DatagramPacket(testData.array(),testData.capacity()); + s.receive(packet); + testData.limit(packet.getLength()); + testData.position(0); + System.out.println("recv "+packet.getLength()+" bytes from "+packet.getAddress()); + return; // one at a time + } + + + public void send(ByteBuffer testData) throws IOException { + DatagramPacket sendPacket = new DatagramPacket(testData.array(), testData.limit(),mAddr, port); + s.send(sendPacket); + testData.position(testData.limit()); + System.out.println("send"); } + public InetAddress getBroadcast0() throws UnknownHostException { + return InetAddress.getByName("192.168.100.66"); + } + public InetAddress getBroadcast() throws SocketException { Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); @@ -87,8 +81,4 @@ } - public void send(ByteBuffer testData) throws IOException { - int out = channel.write(testData); - System.out.println("send "+out+" bytes."); - } } diff -r 9c99e2193277 -r 404778ac3f55 src/wifibroadcast/WifiBroadcastTest.java --- a/src/wifibroadcast/WifiBroadcastTest.java Sat Jul 28 18:15:13 2012 +0900 +++ b/src/wifibroadcast/WifiBroadcastTest.java Sat Jul 28 19:33:34 2012 +0900 @@ -7,11 +7,11 @@ private static int DefaultPort = 8412; private static String MCASTADDR = "224.0.0.1"; private static int testSize = 256; + private static long timeout = 1000; public static void main(String args[]) { int port = DefaultPort ; int count = 16; - long timeout = 1000; boolean multicast = false; boolean mchannel = false; WifiReceiver wbr = null; @@ -26,15 +26,15 @@ try { if (multicast) { wbr = new WifiMulticast(MCASTADDR,port,WifiReceiver.SocketType.Receiver); - Thread.sleep(5000); + Thread.sleep(timeout); wbs = new WifiMulticast(MCASTADDR,port,WifiReceiver.SocketType.Receiver); } else if (mchannel) { wbr = new WifiMulticastChannel(MCASTADDR,port,WifiReceiver.SocketType.Receiver); - Thread.sleep(5000); + Thread.sleep(timeout); wbs = new WifiMulticastChannel(MCASTADDR,port,WifiReceiver.SocketType.Sender); } else { wbr = new WifiBroadcast(port,WifiReceiver.SocketType.Receiver); - Thread.sleep(5000); + Thread.sleep(timeout); wbs = new WifiBroadcast(port,WifiReceiver.SocketType.Sender); } } catch (IOException e) { @@ -63,7 +63,7 @@ ByteBuffer testData = getTestData(testSize); int i = 0; try { - Thread.sleep(1000); + Thread.sleep(timeout); for(i = 0; i