Wifi Direct Multicast Datagrams throw SocketExceptions

260 views
Skip to first unread message

Micah Akin

unread,
Apr 24, 2017, 9:59:31 PM4/24/17
to android-platform
Does anyone know why Android would throw a SocketException when I try to send a DatagramPacket to a Multicast address from a Wifi Direct Group Owner?  

When connected to that host using the regular (wlan0) wifi, I send and receive Multicast without a problem.

(a) <--> (b) <--> (c)

(a) can send Multicast datagrams which (c) receives
(b) throws the below error when trying to send a multicast datagram
(b) is the Wifi Direct Group Owner (GO)
(a) and (c) are connected to (b) using legacy wifi


I am running Android 6.0.1 on a Samsung Galaxy Note 4

Here is a snippet of my code:



StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

WifiManager wifiManager = (WifiManager)this.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(true);

MulticastLock mcastLock = wifiManager.createMulticastLock("lock");
mcastLock.acquire();

try {
Enumeration<NetworkInterface> enumeration = NetworkInterface.
getNetworkInterfaces();
NetworkInterface p2p0 =
null;
NetworkInterface wlan0 =
null;
for (NetworkInterface iface : Collections.list(enumeration)) {

try {
if (iface.getName().equals("p2p0")) {
p2p0 = iface;

if(p2p0.supportsMulticast()){
debug.print("p2p0 supports multicast");
}
else
{
debug.print("p2p0 does not supports multicast");
}
}
else if (iface.getName().equals("wlan0")) {
wlan0 = iface;
if(wlan0.supportsMulticast()){
debug.print("wlan0 supports multicast");
}
else
{
debug.print("wlan0 does not supports multicast");
}
}
}
catch (NullPointerException e){
e.printStackTrace();

}
}
if(mcastLock.isHeld()){
debug.print("MCast Lock held");
}
else
{
debug.print("MCast Lock Not held");
}


String msg =
"Hello from "+name;
InetAddress group = InetAddress.
getByName("224.0.0.1");
MulticastSocket s =
new MulticastSocket(5001);
s.joinGroup(new InetSocketAddress(InetAddress.getByName("224.0.0.1"), 5001), p2p0);
DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(), group, 5001);


// get their responses!
byte[] buf = new byte[1000];
for(int i = 0; i< 30; i++) {
s.send(hi);
// line 261

DatagramPacket recv =
new DatagramPacket(buf, buf.length);
s.receive(recv);
if(recv.getLength()>0) {
System.
out.println("'"+new String(buf, 0 , recv.getLength())+"'");
}

try {
Thread.
sleep(100);
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

// OK, I'm done talking - leave the group...
s.leaveGroup(group);


} catch (IOException e){
e.printStackTrace();
//debug.print(e.);
}



Below is a snippet of the debug trace:  


04-23 19:20:19.492 7083-7083/edu.nps.minet I/System.out: p2p0 supports multicast
04-23 19:20:19.517 7083-7083/edu.nps.minet I/System.out: wlan0 supports multicast
04-23 19:20:19.552 7083-7083/edu.nps.minet I/System.out: MCast Lock held
04-23 19:20:19.572 7083-7083/edu.nps.minet I/System.out: Hello from BDD177B9C6
04-23 19:20:19.597 7083-7083/edu.nps.minet W/System.err: java.net.SocketException: sendto failed: ENETUNREACH (Network is unreachable)
04-23 19:20:19.597 7083-7083/edu.nps.minet W/System.err:     at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:542)
04-23 19:20:19.597 7083-7083/edu.nps.minet W/System.err:     at libcore.io.IoBridge.sendto(IoBridge.java:511)
04-23 19:20:19.597 7083-7083/edu.nps.minet W/System.err:     at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:184)
04-23 19:20:19.597 7083-7083/edu.nps.minet W/System.err:     at java.net.DatagramSocket.send(DatagramSocket.java:305)
04-23 19:20:19.597 7083-7083/edu.nps.minet W/System.err:     at edu.nps.minet.MainActivity$3.onClick(MainActivity.java:261)
04-23 19:20:19.597 7083-7083/edu.nps.minet W/System.err:     at android.view.View.performClick(View.java:5697)
04-23 19:20:19.597 7083-7083/edu.nps.minet W/System.err:     at android.view.View$PerformClick.run(View.java:22526)
04-23 19:20:19.597 7083-7083/edu.nps.minet W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
04-23 19:20:19.597 7083-7083/edu.nps.minet W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
04-23 19:20:19.597 7083-7083/edu.nps.minet W/System.err:     at android.os.Looper.loop(Looper.java:158)
04-23 19:20:19.597 7083-7083/edu.nps.minet W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:7225)
04-23 19:20:19.597 7083-7083/edu.nps.minet W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
04-23 19:20:19.597 7083-7083/edu.nps.minet W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
04-23 19:20:19.597 7083-7083/edu.nps.minet W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
04-23 19:20:19.597 7083-7083/edu.nps.minet W/System.err: Caused by: android.system.ErrnoException: sendto failed: ENETUNREACH (Network is unreachable)
04-23 19:20:19.597 7083-7083/edu.nps.minet W/System.err:     at libcore.io.Posix.sendtoBytes(Native Method)
04-23 19:20:19.597 7083-7083/edu.nps.minet W/System.err:     at libcore.io.Posix.sendto(Posix.java:211)
04-23 19:20:19.597 7083-7083/edu.nps.minet W/System.err:     at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:278)
04-23 19:20:19.597 7083-7083/edu.nps.minet W/System.err:     at libcore.io.IoBridge.sendto(IoBridge.java:509)
04-23 19:20:19.597 7083-7083/edu.nps.minet W/System.err: ... 12 more
Reply all
Reply to author
Forward
0 new messages