我有三个网络接口的计算机-一个真实的和两个VMWare虚拟的。我希望在端口1900上接收来自UPNP设备的多播消息。
我试图激活所有适配器并为每个适配器创建一个套接字。另外,我设置了套接字选项ReuseAddr,关闭ExclusiveAddrUse套接字选项,并将每个套接字添加到多播组239.255.255.250。我将套接字绑定到addr: InterfaceAddr:1900
问题是,只有一个套接字接收消息-一个VMWare网络套接字。netstat -a -o -p UDP >netstat.txt向我展示了我所有的套接字都在监听:
Proto Local address
正在通过多播向我发送xml源,但我不知道多播组地址。我可以改用localhost吗?也就是说,
Socket socket =
new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
IPEndPoint ip = new IPEndPoint(IPAddress.Any,8888);
socket.Bind(ip);
socket.SetSocketOption
(SocketOptionLevel.IP,
SocketOptionName.AddMembership,
📷
感觉我离解决问题越来越近了.
这是组播的简化版本..。
启用所有接口的-No RPF故障-pim稀疏模式
我强迫一个组加入并从接收路由器点击多播组,并看到了正在转发的数据包。尽管如此,用户仍然没有看到提要。
有一件事我注意到了,那就是我不得不为抛出红旗的那一天准备好了。
在会合点,从原木上看,有很多
%PIM-1-INVALID_RP_REG: Received Register from router x.x.x.x for group 237.0.0.1, 1.2.3.4 not willing to be RP
如果使用非组播成员发现方法,为Hazelcast组使用默认名称(例如"my-product- name ")是不是不好的做法?
我的担忧基于以下场景……如果您在同一网络上有多个Hazelcast组,但成员不同,这意味着什么?它们将作为单独的组正常工作,还是会出现问题,例如将消息发送给错误组的成员?
例如,如果您有一个名为"dev“的组,其中包含在笔记本电脑上运行的通过TCP/IP配置发现的节点A和B(即,显式定义了成员),而某人在同一网络上的另一台PC上启动了一个也名为"dev”的新组,并且显式定义了成员C和D-这些群集/组在彼此隔离的情况下是否能很好地工作?
我知道网络上有很多关于C#中UDP多播的例子。这更多的是为了澄清只在发送时包含方法JoinMulticastGroup的必要性。我遇到的大多数代码示例几乎总是将此方法作为初始化代码的一部分。但是,如果程序或类只发送一次,那么它是不需要的?
也就是说,在另一个堆栈溢出问题上,有人使用了代码
public void SendMessage(string message)
{
var data = Encoding.Default.GetBytes(message);
using (var udpClient = new UdpClient(AddressFamily.InterNe