无法接收使用Zeromq PGM协议的消息

本文关键字:PGM 协议 消息 Zeromq | 更新日期: 2023-09-27 18:16:07

我正在尝试使用PGM协议创建一个基于zeromq的服务器/客户端PUB-SUB,所有这些都在我的本地计算机上。

由于某些原因,我卡住了:

string a = clientsocket.Receive(Encoding.Unicode);

这只是为了测试,我没有得到一个异常,程序只是等待。

服务器代码:

var context = ZmqContext.Create();
ZmqSocket serversocket = context.CreateSocket(SocketType.PUB);
try
{
    serversocket.Bind("epgm://192.168.137.127;224.0.0.1:5555");
}
catch (ZmqException)
{
    throw;
}
int x = 0;
Console.WriteLine("UP");
while (x < 100)
{
    serversocket.Send("hello",Encoding.Unicode);
    Console.WriteLine("hello sent {0}",x.ToString()); 
    Thread.Sleep(2000);
    x++;
}
客户机代码:

context = ZmqContext.Create();
clientsocket = context.CreateSocket(SocketType.SUB);
try
{
    clientsocket.Connect("epgm://192.168.137.127;224.0.0.1:5555");
}
catch (ZmqException)
{
    throw;
}
clientsocket.SubscribeAll();
clientsocket.ReceiveReady += PollingItemEvens;
string a = clientsocket.Receive(Encoding.Unicode);
if (a == "hello")
{
   Application.Run(_form1);
}
var poller = new Poller(new List<ZmqSocket> {clientsocket});
while (true)
{
    poller.Poll();
}

编辑 [2014-08-04 1640 UTC + 0000]

阅读文档后,我已经更改了epgm IP。然而,这并没有解决问题……

我的IPv4是192.168.137.127

这是笔记本电脑上的热点,有什么不同吗?

,我可以在windows cmd上看到'netstat'上的epgm吗?因为我没看到

无法接收使用Zeromq PGM协议的消息

您应该查看0MQ的pgm/epgm文档:

特别是

:

连接套接字

当使用zmq_connect() with连接套接字到对等地址时对于PGM或epgm传输,端点应解释为接口后面跟着分号,后面跟着多播地址,后接冒号和端口号

接口可以用下列任意一种方式指定:

•操作系统定义的接口名称。

•分配给接口的主IPv4地址,用数字表示。

接口名称没有以任何方式标准化,应该假设任意和平台依赖。在Win32平台上接口名称已经存在,只能使用主IPv4地址指定接口。

组播地址由its中的IPv4组播地址指定数字表示法。

如果你遵循文档,"epgm://224.0.0.1:8200"的地址是无效的:它缺少地址的接口部分

实用通用组播PGM/EPGM

使用稍微不同的寻址结构,增加了接口部分:

/* Connecting to the multicast address 224.0.0.1, port 8200,                    */
/* using the <localhost> first Ethernet network interface on Linux              */
/* and the Encapsulated PGM protocol                                            */
rc = zmq_connect( socket, "epgm://eth0;224.0.0.1:8200" );
assert ( rc == 0 );
/* Connecting to the multicast address 224.0.0.1, port 8200,                    */
/* using the <localhost> network interface setup with the address 192.168.1.1   */
/* and the standard PGM protocol                                                */
rc = zmq_connect( socket, "pgm://192.168.1.1;224.0.0.1:8200" );
assert ( rc == 0 );

现在检查和修复服务器端的ISO-OSI-L3网络地址,使它们与有效的本地IPv4网络地址相匹配,您的服务器所在的位置以及它尝试.PUB的位置。

附录

802.11 (Wi-Fi)标准指定支持多播作为异步服务的一部分。802.11客户机站,例如无线笔记本电脑或PDA(不是接入点),通过仅向接入点发送802.11单播数据帧中的组播数据包来开始组播交付。如果数据帧中没有发现错误,接入点将发送一个802.11确认帧给源站

如果发送帧的802.11客户端没有收到确认,则客户端将重传帧。使用多播,从无线802.11客户机到接入点的数据路径的分支包括传输错误恢复。当使用单播数据帧传输时,802.11协议确保了基础设施和临时配置中的站点之间的可靠性。

接入点从802.11-客户端接收到单播数据帧后,将数据(发起802.11-客户端希望组播的数据)作为组播帧发送,其中包含一个组地址作为目标接收方的目的地址。每个目的站都可以接收帧;但是,它们不回应致谢。因此,多播不能保证完整、可靠的数据流。

在多播中缺少确认意味着应用程序发送的一些数据可能无法到达所有目的地,并且没有成功接收的迹象。

来自Martin Sustrik (ZeroMQ的创始人之一)的留言:

然而,应该注意的是,多播传输是固有的复杂的设置和经常失败,由于不充分的网络硬件,不正确的HW/OS设置等

将有用的发布:

  1. 使您选择EPGM的关键优势transportClass

  2. 一个与应用程序无关的验证-测试用例,用于证明{zeromq层| zeromq原语}的每个孤立部分{是|不是}的生命周期的后续阶段。

灵感可能来自:https://www.mail-archive.com/zeromq-dev@lists.zeromq.org/msg01580.html