# HG changeset patch # User one # Date 1343466913 -32400 # Node ID 9c99e219327752d3831695cf1bbf174027c1316f # Parent 2a328333ba70b0c6e948104ea8bc78c0c5b8b1a3 find broadcast diff -r 2a328333ba70 -r 9c99e2193277 src/wifibroadcast/WifiBroadcast.java --- a/src/wifibroadcast/WifiBroadcast.java Sat Jul 28 13:06:57 2012 +0900 +++ b/src/wifibroadcast/WifiBroadcast.java Sat Jul 28 18:15:13 2012 +0900 @@ -1,7 +1,11 @@ package wifibroadcast; +import java.net.NetworkInterface; import java.io.IOException; +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.nio.ByteBuffer; @@ -9,24 +13,40 @@ 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; - public WifiBroadcast(int port) throws IOException { + 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); - try { - InetSocketAddress address = new InetSocketAddress("::", port); - channel.connect(address); - } catch (SocketException e) { - // for some bad IPv6 implementation - channel.connect(new InetSocketAddress(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); + } 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)); + } } channel.register(selector, SelectionKey.OP_READ); } @@ -41,11 +61,34 @@ testData.flip(); return; // one at a time } + } else { + System.out.println("receiver time out"); + testData.position(0); testData.limit(0); } } + + public InetAddress getBroadcast() throws SocketException { + Enumeration interfaces = + NetworkInterface.getNetworkInterfaces(); + while (interfaces.hasMoreElements()) { + NetworkInterface networkInterface = interfaces.nextElement(); + if (networkInterface.isLoopback()) + continue; // Don't want to broadcast to the loopback interface + for (InterfaceAddress interfaceAddress : + networkInterface.getInterfaceAddresses()) { + InetAddress broadcast = interfaceAddress.getBroadcast(); + if (broadcast == null) + continue; + // Use the address + return broadcast; + } + } + throw new SocketException(); + } public void send(ByteBuffer testData) throws IOException { - channel.write(testData); + int out = channel.write(testData); + System.out.println("send "+out+" bytes."); } } diff -r 2a328333ba70 -r 9c99e2193277 src/wifibroadcast/WifiBroadcastTest.java --- a/src/wifibroadcast/WifiBroadcastTest.java Sat Jul 28 13:06:57 2012 +0900 +++ b/src/wifibroadcast/WifiBroadcastTest.java Sat Jul 28 18:15:13 2012 +0900 @@ -3,19 +3,19 @@ import java.io.IOException; import java.nio.ByteBuffer; -import javax.sql.rowset.Joinable; - public class WifiBroadcastTest { - private static int DefaultPort = 8212; + private static int DefaultPort = 8412; private static String MCASTADDR = "224.0.0.1"; + private static int testSize = 256; public static void main(String args[]) { int port = DefaultPort ; - int count = 1024; + int count = 16; long timeout = 1000; boolean multicast = false; boolean mchannel = false; WifiReceiver wbr = null; + WifiReceiver wbs = null; for(int i=0;i0) { + dc.receive(testData); + } else { + testData.limit(0); testData.position(0); + } } @Override diff -r 2a328333ba70 -r 9c99e2193277 src/wifibroadcast/WifiReceiver.java --- a/src/wifibroadcast/WifiReceiver.java Sat Jul 28 13:06:57 2012 +0900 +++ b/src/wifibroadcast/WifiReceiver.java Sat Jul 28 18:15:13 2012 +0900 @@ -5,6 +5,8 @@ public interface WifiReceiver { + public enum SocketType {Sender , Receiver } ; + void recieve(ByteBuffer testData, long timeout) throws IOException; void send(ByteBuffer testData) throws IOException;