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

时间:2014-08-03 18:23:17

标签: c# zeromq

我正在尝试使用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

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

我可以在windwos cmd上看到'netstat'上的epgm吗? 因为我什么也看不见

2 个答案:

答案 0 :(得分:4)

实用的通用多播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协议可确保基础设施和ad hoc配置中站之间的可靠性。

在从802.11-客户端接收到单播数据帧之后,接入点将数据(发起的802.11-客户端想要多播)作为多播帧发送,该多播帧包含组地址作为预期接收者的目的地。每个目标站都可以接收帧;但是,他们没有回复确认。因此,多播并不能确保完整,可靠的数据流。

多播确认缺失意味着您的应用程序发送的某些数据可能无法进入所有目的地,并且没有表明接收成功。

Martin Sustrik(ZeroMQ的共同父亲)的一份说明:

  

但是,应该注意多播传输本身就是如此   设置复杂,并且由于网络不足而经常失败   硬件,错误的硬件/操作系统设置等。

下一步

发布以下内容会很有用:

  1. 主要优势,让您选择EPGM transportClass

  2. 应用程序中立的验证测试用例,用于证明{ZeroMQ-layer |的每个隔离部分的生命周期的后续阶段ZeroMQ-primitives} {are |没有像你期望的那样工作。

  3. 可能受到以下因素的启发:https://www.mail-archive.com/zeromq-dev@lists.zeromq.org/msg01580.html

答案 1 :(得分:4)

您应该查看pgm/epgm documentation for 0MQ

特别是:

  

连接插座

     

使用zmq_connect()将套接字连接到对等地址时   在pgm或epgm传输中,端点应解释为   接口后跟分号,后跟多播地址,   然后是冒号和端口号。

     

可以通过以下任一方式指定接口:

     

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

     

•分配给接口的主IPv4地址,以其数字表示形式。

     

接口名称没有以任何方式标准化,应该假设   是任意的和平台相关的。在Win32平台上没有简短   存在接口名称,因此只能使用主IPv4地址   指定一个接口。

     

组播地址由其中的IPv4多播地址指定   数字表示。

如果您按照文档操作,"epgm://224.0.0.1:8200"的地址无效:它缺少地址的接口部分。