问题标签 [multicast]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
5760 浏览

objective-c - Objective-C - 以编程方式确定 iPod touch 的 IP 地址

我正在用 Objective-C 为几个 iPod 设备编程,我想知道一些事情。我正在开发一个利用服务器-客户端模型的应用程序,并且我正在使用带有 C 套接字的 UDP 协议。是否有一个类可以让我确定 iPod 设备的 IP 地址?在谷歌搜索其他论坛后,我没有找到任何东西。显然这个命令是行不通的,但是像 ipAddress = self.ip 这样的命令是我想到的。我正在设置多播 C 套接字,我正在尝试做一个类似于 ping 命令的解决方法,这显然在 Objective-C 中也不存在,或者据我所知(这是有限的,因为我只是在编程至少在今年夏天开始以来在Objective-C中)。有什么建议或提示吗?

0 投票
4 回答
10352 浏览

c# - 为什么订阅多播组的 UDP 套接字正在接收非多播消息?

概述:我已经设置了一个服务器和一个客户端,两者都尝试使用 UDP 发现彼此。当服务器启动时,它会发送一条多播消息 (239.1.1.1),表明它还活着。当客户端启动时,它会发送一条多播消息 (239.1.1.2),表明它是活动的。服务器和客户端都订阅了彼此的多​​播消息以接收它们的传输。这样,无论哪个应用程序(服务器或客户端)首先启动,都会通知其中一个或另一个它们的存在。

在客户端,我执行以下操作:

  1. 设置一个监听套接字来订阅和接收来自服务器的多播消息。

  2. 根据下面的 #3设置接收套接字以接收服务器对客户端多播消息的响应。
  3. 发送客户端正在运行的多播消息(供服务器接收和响应)。
  4. 接收服务器对 #3 中发送的客户端多播消息的响应。

问题:一切正常,除了两个接收套接字最终都得到服务器(非多播)对客户端的响应。我不清楚这是否是预期的行为。我可以将两个接收插座减少到一个吗?#1 订阅了服务器的多播,而#2 只是在同一端口上侦听来自服务器的直接传输(来自服务器的非多播消息)。我可以安全地移除第二个接收插座吗?

请参阅下面的源代码(为了更简单的代码演示,我删除了异常处理)。

客户端代码:

服务器代码:

0 投票
4 回答
8687 浏览

sockets - UDP 服务器发现 - 客户端应该发送多播以查找服务器还是服务器应该发送常规信标?

我有需要全部连接到单个服务器进程的客户端。我正在为客户端使用 UDP 发现来查找服务器。我让客户端和服务器交换IP地址和端口号,以便在发现完成后建立TCP/IP连接。这样,数据包的大小就可以保持很小。我看到这可以使用 UDP 以两种方式之一完成:

  1. 每个客户端发送自己的多播消息以搜索服务器,然后服务器对其进行响应。客户端可以定期(在服务器关闭的情况下)重复发送此多播消息,直到服务器响应。
  2. 服务器定期发送多播消息信标。客户端订阅多播组,从而接收到服务器的多播消息并完成发现。

1. 如果有很多客户端,那么最初会传输许多多播消息(每个客户端一个)。只有服务器会订阅和接收来自客户端的多播消息。一旦服务器响应客户端,客户端停止发送多播消息。一旦所有客户端都完成了对服务器的发现,就不会再在网络上传输多播消息。但是,如果服务器已关闭,则每个客户端将间隔发送多播消息信标,直到服务器备份并可以响应。

2. 只有服务器会定期提交多播消息信标。该消息最终会被路由到订阅多播组的所有客户端。一旦客户端收到数据包,客户端的 UDP 侦听套接字就会关闭,并且它们不再订阅多播组。但是,服务器必须继续发送多播信标,以便新客户端可以发现它。它会继续定期发送信标,无论是否有任何客户端需要发现。

所以,无论哪种方式,我都看到了利弊。在我看来,#1 最初会导致更重的负载,但这个负载最终会减少到零。在#2中,服务器将永远继续发送信标。

UDP 和多播对我来说是一个相当新的话题,所以我有兴趣找出哪种方法是首选方法,哪种方法可以减少网络负载。

0 投票
3 回答
9666 浏览

c# - 在运行时为接口创建一个类,在 C# 中

我正在考虑获取一组对象,假设目前有 3 个对象处于活动状态,它们都实现了一个通用接口,然后将这些对象包装在第四个对象中,也实现了相同的接口。

第四个对象的方法和属性实现将简单地调用这 3 个底层对象的相关位。我知道在某些情况下这样做没有意义,但这是针对服务多播架构的,因此已经存在一系列很好的限制。

我的问题是从哪里开始。第四个对象的生成应该在内存中,在运行时完成,所以我在想Reflection.Emit,不幸的是我没有足够的经验,甚至不知道从哪里开始。

我必须构建一个内存程序集吗?它看起来确实是这样,但我只想快速指向我应该从哪里开始。

基本上,我正在考虑获取一个接口和一个对象实例列表,它们都实现了该接口,并构造了一个新对象,也实现了该接口,它应该“多播”所有方法调用和对所有底层对象的属性访问,在尽可能少。会有很多与异常有关的问题,但我会在遇到这些问题时解决这些问题。

这适用于面向服务的架构,我希望现有代码以记录器服务为例,现在可以访问多个记录器服务,而无需更改使用这些服务的代码。相反,我想运行时生成一个 logger-service-wrapper,它在内部简单地调用多个底层对象的相关方法。

这适用于 .NET 3.5 和 C#。

0 投票
2 回答
2474 浏览

c - 链接范围 IPv6 多播数据包突然无法在 MacBook Pro 上路由?

这是一个有点晦涩的问题,但我很困惑,我想也许外面的人可能对这个问题有更多的线索。

我的同事几个月来一直在他的 MacBook Pro 上成功运行一个使用 IPv6 多播的内部应用程序,但今天 Mac 决定停止路由多播数据包。特别是,程序会打印此错误:

SendDataUDP(ff02::bead:cede:deed:feed@4) 在网络接口 [名称=[en0] 描述=[] IP=[fe80::222:41ff:fe21:dfd4@4] 网络掩码=[ffff: ffff:ffff:ffff::] Broadcast=[::]] (errno=65/没有到主机的路由)。

...这很好地描述了出了什么问题...它试图将 UDP 数据包发送到所示的 IP 地址,并且 send() 失败并显示 errno=EHOSTUNREACH。

我不明白的是,什么可能导致 IPv6 链接范围多播地址“无法访问”?如果我对链接范围多播的理解是正确的,则数据包只需从本地以太网端口(在这种情况下为 en0,它已启动并在该机器上工作)发出。

我是否缺少多播的某些方面,或者他的机器只是坏了?他说他没有改变任何东西,只是神秘地停止了工作。

0 投票
3 回答
466 浏览

multicast - 作为开发人员,我是否需要完全了解 IGMP、PIM-DM 和 PIM-SM 等组播协议?

我们在我们的应用程序中利用多播向连接到中间层的客户端有效地广播更新。网络工程师不断向我询问“我们的多播如何工作”以及它支持哪些多播协议。我对这些类型的问题感到困惑,就我而言,我们的客户端进程只需通过发出以下命令来加入多播组:

那里没有关于它应该使用什么多播协议的区别。 有人对我如何回答这类问题有任何有用的建议吗? 目前我只是提供我们多播的地址/端口,并要求他们在他们的网络路由器上打开这个地址/端口。然而,这似乎还不够,他们需要更多信息(?)

0 投票
1 回答
6331 浏览

java - 同一主机上的 2 个实例之间的 ehcache 自动发现(通过多播)

我在同一台主机上运行 2 个 tomcat 实例。每个实例都运行相同的 Web 应用程序,该应用程序尝试通过 RMI 复制与一些 ehcache 缓存进行通信。我在 ehcache 中使用自动发现配置,因此我不必明确定义哪些是主机,哪些是我要复制的缓存。ehcache 实例无法找到彼此并进行通信:

如果我尝试同样的事情,但这次在单独的主机(框)上运行每个 tomcat 实例,那么一切都像一个魅力。

我做错了什么,或者当实例位于同一主机上时,是否可以通过多播进行自动发现?

我的配置使用RMI 分布式缓存文档中提供的默认值:

在我要复制的每个缓存区域内,我有:

谢谢

0 投票
1 回答
1692 浏览

c# - C# UDP 多播在几秒钟后断开连接

我有一些网络代码连接到多播地址,但几秒钟后断开连接。谁能弄清楚这段代码有什么问题?

调用 Connect() 函数后,它报告为已连接,但等待一两秒钟,它就会断开连接。我绑定到错误的端口还是什么?每个在线教程似乎都以不同的方式进行。

0 投票
1 回答
654 浏览

.net - 使用 MSMQ 的多播时如何检测不可恢复的数据丢失?

使用 MSMQ 多播时,如果(启用多播的)队列接收到一些消息,然后机器遇到暂时的网络连接丢失,则在重新建立连接时它将再次开始接收消息。如果网络中断的持续时间很短,那么队列将接收所有消息(即使是在接收机器断开连接时发送的消息)。但是,如果持续时间足够长(几分钟),那么一些消息将会丢失......接收到的消息会有间隙。

这是预期的行为,因为 MSMQ 多播提供可靠(但不保证交付)。我的问题是 MSMQ 是否在数据丢失时公开信息。如果我理解正确的话,PGM已经能够检测到“不可恢复的数据丢失”,但是 MSMQ 会公开这些信息吗?

一种想法是在每条消息中包含一个整数,该整数在每次发送时递增。这将允许接收者检测消息中的间隙(来自单个发送者)。但是,我相信 PGM 已经做到了这一点。如果 PGM/MSMQ 已经可以检测到这一点,我不想在应用程序级别添加它。

有什么建议么?

0 投票
4 回答
1212 浏览

java - 组播发送性能

我们最近完成了对多播发送性能的分析。令人高兴的是,当我们在 Windows 和 Solaris 上测试不同的流量发送速率时,Java 和 C 的性能几乎相同。

但是,我们注意到发送多播消息的时间随着发送之间时间的增加而增加。我们调用发送的频率越高,完成发送调用所需的时间就越少。

该应用程序允许我们控制在调用发送之间等待的时间量,在下面您会看到随着数据包之间的延迟增加而增加的时间。当发送 1000 个数据包/秒(1 ms 等待时间)时,调用 send 只需要 13 微秒。在 1 个数据包/秒(1000 毫秒等待时间)下,该时间增加到 20 微秒。

我们在 Java 和 C 以及 Windows 和 Solaris 上都看到了这种现象。我们正在使用 Intel Pro 1000 双端口网卡的戴尔 1950 服务器上进行测试。微基准测试很难,尤其是在 Java 中,但我们认为这与 JITing 或 GC 无关。

我用于测试的 Java 代码和命令行位于:http ://www.moneyandsoftware.com/2009/09/18/multicast-send-performance/