我正在编写一个应用程序,通过多播进行一些基本的通信。我遇到了问题,可以解释原因。我是根据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" />
有什么想法吗?希望我只是错过了一些小事。
答案 0 :(得分:1)
套接字已正确构造。你没有连接它,所以它的overflow:hidden
返回null,它的目标端口是-1。
这与它加入的多播组没有任何关系。你的期望是错误的。
仅当此主机不是该组的成员时才会发送IGMP消息。