Android MutlicastSocket构造函数问题

时间:2015-09-12 18:10:54

标签: android sockets udp multicast

我正在编写一个应用程序,通过多播进行一些基本的通信。我遇到了问题,可以解释原因。我是根据API中的构造函数定义套接字,但实际上并没有按照指定的方式设置变量。这是一个基本的代码片段,删除了一堆额外的东西:

import java.net.MulticastSocket;
import java.net.InetAddress;
import java.net.NetworkInterface;
...

private InetAddress groupInetAddr = InetAddress.getByName("239.42.42.42");;
private int groupPort = 42000;
private MulticastSocket groupSocket;

netInt = NetInfo.getInterface(); 
//This is a custom method that chooses a candidate NetworkInterface 
//from available options.  Returns a NetworkInterface object

try{
   groupSocket = new MulticastSocket(groupPort);
   groupSocket.setNetworkInterface(netInt);
   groupSocket.joinGroup(groupInetAddr);
   groupSocket.setTimeToLive(64);
} 
catch (Exception e){
   Log.i(TAG, "FAILED");
}

我在此代码后面有一些测试代码,以确认套接字是否已正确创建,并且不是......

Log.i(TAG, "groupInetAddr: " + groupInetAddr.toString());
Log.i(TAG, "groupPort: " + groupPort);
Log.i(TAG, "groupSocket.getInetAddress: " + groupSocket.getInetAddress());
Log.i(TAG, "groupSocket.getPort(): " + groupSocket.getPort());

测试的日志结果:

GroupSender﹕ groupInetAddr: /239.42.42.42
GroupSender﹕ groupPort: 42000
GroupSender﹕ groupSocket.getInetAddress: null
GroupSender﹕ groupSocket.getPort(): -1

因此,正如您所看到的,正在正确创建InetAddress,因此这不是问题,但套接字未将InetAddress指定为目标。此外,当我检查Wireshark时,没有IGMP消息通过LAN发送到该地址。

此外,我已将以下权限添加到AndroidManifest.xml以允许访问必要的服务。

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

<uses-feature android:name="android.hardware.wifi" />

有什么想法吗?希望我只是错过了一些小事。

1 个答案:

答案 0 :(得分:1)

套接字已正确构造。你没有连接它,所以它的overflow:hidden返回null,它的目标端口是-1。

这与它加入的多播组没有任何关系。你的期望是错误的。

仅当此主机不是该组的成员时才会发送IGMP消息。