我正在C#中编写UDP多播客户端/服务器对,我需要50-100μsec(微秒)的延迟来限制服务器传输速率.这有助于避免重大数据包丢失,还有助于防止磁盘I/O绑定的客户端过载.请不要建议Thread.Sleep或Thread.SpinWait.我不会问我是否需要其中任何一个.
我的第一个想法是使用某种高性能计数器,然后做一个简单的while()循环来检查已用时间,但我想避免这种情况,因为它感觉很笨拙.那不会也会占用服务器进程的CPU利用率吗?
跨平台解决方案的奖励积分,即不是Windows特定的.先谢谢你们!
因此,在阅读了一些文档并从这里获得了很多帮助后,我终于实现了一个动态选择端点的收件人列表(动态收件人列表):
在我的代码中,MainApp_A每10秒生成一次报告,我希望它能够同时将报告发送到所有服务器,而不是逐个发送.因此,我开发了以下路线.
MainApp_A
main.addRouteBuilder(new RouteBuilder(){
@Override
public void configure() throws Exception {
from("direct:start").multicast().parallelProcessing()
.beanRef("recipientListBean", "route").end()
.log("${body}");
}
});
Run Code Online (Sandbox Code Playgroud)
RecipientListBean
@RecipientList
public Set<String> route(String body) {
return servers; //returns a collection of several severs
}
Run Code Online (Sandbox Code Playgroud)
我还检查了多播模式和动态路由的文档:
现在我有几个问题,我很困惑.所以我有几个问题:
作为这个问题的后续问题,我已经在我的本地机器上运行了一个解决方案,但是没有在网络上的机器上运行.
我不太了解那些基础知识以外的插座,所以请耐心等待.目标是让客户端在本地网络上查找服务器,这是一些剪切/粘贴/编辑代码的结果.
这是客户端代码:
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10294);
byte[] data = new byte[1024];
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 10);
string welcome = "What's your IP?";
data = Encoding.ASCII.GetBytes(welcome);
client.SendTo(data, data.Length, SocketFlags.None, ipep);
IPEndPoint server = new IPEndPoint(IPAddress.Any, 0);
EndPoint tmpRemote = (EndPoint)server;
data = new byte[1024];
int recv = client.ReceiveFrom(data, ref tmpRemote);
this.IP.Text = ((IPEndPoint)tmpRemote).Address.ToString(); //set textbox
this.Port.Text = …Run Code Online (Sandbox Code Playgroud) 在Java世界中,可靠多播的现代方法是什么?
在网上搜索,我想出了JGroups和JRMS.JGroups在我的情况下似乎有些过分(我希望有一组相同的节点,这些节点通过一起协作并通过通知每个现有节点来加入这个组).JRMS看起来已经死了.
我无法找到任何针对Java的PGM协议的特定实现.
我只是好奇.这是一个API错误吗?加入组播组时,不要使用端口,只使用组播组(IP)作为组播组,对吗?
这是一个令人烦恼的情况,是否会使用PORT?
我有几台嵌入式计算机正在监听并将rtp音频数据流式传输到多播组.它们连接到智能管理交换机(Netgear GS108Ev2),它在其端口上执行基本的igmp监听和多播过滤,因此我的(W)LAN的其余部分不会被淹没.
开始时一切正常,大约500-520秒.之后,他们在离开并再次加入该组之前不会再收到任何数据.我想交换机在超时后"忘记"加入了.
有没有办法刷新组成员资格,即让交换机知道,还有人在监听,而不会丢失数据包?
系统信息:
Arch: blackfin
# cat /proc/version
Linux version 2.6.28.10-ADI-2009R1-uCBF54x-EMM
(gcc version 4.3.3 (ADI) ) #158 PREEMPT Tue Jun 5 20:05:42 CEST 2012
Run Code Online (Sandbox Code Playgroud) 当我创建两个udp套接字并将它们绑定到INADDR_ANY和相同的端口号时.但其中一人加入了一个组播组.但是它们都可以从同一个组播组接收数据,即使其中一个套接字没有加入组播组.
这是一些用于设置多播接收器的Python代码.它在mac和linux上运行良好.
import socket, struct
ADDR='239.239.250.1'
PORT=8001
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((ADDR, PORT))
mreq = struct.pack("4sl", socket.inet_aton(ADDR), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
Run Code Online (Sandbox Code Playgroud)
但在Windows上运行时在绑定上收到错误10049.
Z:\winx>c:\Python27\python.exe q2.py
Traceback (most recent call last):
File "q2.py", line 11, in <module>
sock.bind((ADDR,PORT))
File "c:\Python27\lib\socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 10049] The requested address is not valid in its context
Run Code Online (Sandbox Code Playgroud)
Windows多播是否存在已知问题?如果没有,我可以采取哪些步骤进行诊断?
这个问题是关于在同一主机内发送和接收多播,同时将其发送到其他主机。
即使经过数小时的谷歌搜索,我也无法弄清楚如何在同一主机内路由多播数据报..!
下面是问题的详细描述:
Linux 机器“A”通过电缆连接到交换机/路由器(我们称交换机/路由器为“R”)。
在 linux box A 中,我有一个进程(A0)将 UDP 数据包发送到多播地址“224.0.0.0”,端口 5000。
同样,在同一个框 A 中,我有两个进程(A1 和 A2),都连接到 224.0.0.0、端口 5000 并消耗 UDP 数据包。
现在,box A 中的内核如何管理路由?
因此,A0 发送了一个数据报,该数据报被 A1 和 A2 消费。这样的数据报是否进行往返 A --> R --> A ?
.. 或者“A”中的内核路由是否足够智能以避免这种不必要的往返?(即数据报由 A0 发送并立即被 A1 和 A2 消耗,永远不会离开 A)。
当然,可以通过为多播创建和强制执行环回设备来确保多播数据报永远不会离开 A:
sudo ifconfig lo multicast
sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev lo
Run Code Online (Sandbox Code Playgroud)
但是现在,如果我想在另一个 linux 机器中同时使用 UDP 数据报,比如说“B”,它们就无法到达那里。
因此,理想情况下,(1)在 A 中消耗的数据报永远不应该离开 A(即没有往返 A --> R --> A),而(2)在 B 中消耗的数据报应该正常地作为 A --> …
为了在通信1-> n中最佳地利用网络带宽,我需要使用多播.在具有IGMP侦听交换机的内部数据中心中,组播的优势是显而易见的.但是,在像AWS这样的IaaS中,这并不明显,因为我们从硬件基础架构中抽象出来.当您需要将大约400 Mbps传输到可能托管在任何物理服务器中的多个EC2实例时,问题就出现了.所以这就是为什么我要问AWS是否支持组播和IGMP监听.