我正在使用多播来实现简单的发现服务。应用程序上的几个实例必须能够在同一主机上运行,因此我最终会在同一主机上使用多个组播套接字,这些套接字是同一组的成员。
在Linux上,这可以按预期工作。主机上的每个应用程序实例都会收到发送到多播地址的消息。
但是,在Windows上,只有第一个加入多播组的应用程序才会收到发送的消息。
以下是我用来创建多播套接字的代码:
socket = new MulticastSocket(PORT);
InetAddress group = InetAddress.getByName(ADDRESS);
socket.joinGroup(group);
socket.setTimeToLive(TTL);
我需要设置一些选项吗?我已经尝试过搜索API但我找不到任何东西。
编辑:根据this website,我需要设置SO_REUSEADDR
,但这只能在套接字绑定之前设置。似乎MulticastSocket的构造函数似乎在创建时绑定套接字。
答案 0 :(得分:2)
您可以通过创建不带参数的套接字来执行此操作,然后在该对象上调用bind。
socket = new MulticastSocket();
socket.setReuseAddress(true);//redundant, already set with empty constructor
SocketAddress sockAddr = new InetSocketAddress(PORT);
socket.bind(sockAddr);
InetAddress group = InetAddress.getByName(ADDRESS);
socket.joinGroup(group);
socket.setTimeToLive(TTL);