【问题标题】:Can't receive message with Zeromq PGM protocolZeromq PGM 协议无法接收消息
【发布时间】:2014-08-03 18:23:17
【问题描述】:

我正在尝试使用 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 吗? 因为我什么都没看到

【问题讨论】:

  • 我知道这是一篇旧帖子,但我在使用 ZMQ 时遇到了同样的问题。您找到任何解决方案了吗?那是什么?

标签: c# zeromq


【解决方案1】:

你应该看看pgm/epgm documentation for 0MQ

特别是:

连接套接字

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

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

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

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

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

一个多播地址由一个 IPv4 多播地址指定 数字表示。

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

【讨论】:

  • 您好,我接受了您的建议并阅读了文档,并纠正了我的错误,谢谢。但问题是钢铁一样。如果您能提供帮助,我将不胜感激:我将 ip 更改为:clientsocket.Connect("epgm://192.168.137.127;224.0.0.1:8200");
  • @DoronEli 尝试使用您现在正在测试的内容编辑您的问题(清楚地表明您进行了编辑)。或者干脆再发一个问题,让0MQ知识比你我更懂的人来回答^^
【解决方案2】:

实用的通用组播 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. 关键优势让您选择了 EPGMtransportClass

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

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

【讨论】:

  • 我做了指示。而且它钢不起作用..什么是'断言(rc == 0);'?我似乎无法在 C# 中找到该命令
  • 重点在于特定的 [epgm] 寻址 <_atransportclass_>://<_aninterface_>;<_anipaddress_>
  • 对于assert( { &lt;_aPrecondition_&gt; | &lt;_aPostCondition_&gt; } );,请检查Wiki >>> en.wikipedia.org/wiki/Assert.h 和“操作方法”作为断言的推荐做法>>> ptolemy.eecs.berkeley.edu/~johnr/tutorials/assertions.html
  • 我知道重点是 epgm 地址。我改正了我的错误你能回头看看我原来的帖子,看看你是否发现了另一个错误?
  • 我不明白你的编辑你能更具体吗?也许你有一个例子?
猜你喜欢
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多