如何使用ZeroMQ监控机制来检测网络?

时间:2017-11-14 05:51:21

标签: c# android zeromq

甲。描述

我正在使用ZeroMQ监视器,我发现它在逻辑断开时有效,但在网络故障时不能正常工作(拔掉我的电缆)。

例如:

  • 我在Android平板电脑上启动客户端应用程序,然后在我的Windows笔记本电脑上启动服务器应用程序。它们通过带有电缆的路由器连接。
  • 如果我手动关闭或打开客户端应用程序或服务器应用程序,监视器的一切都会正常。也就是说,双方的监视器都可以接收“连接”或“接受”和“断开”事件。
  • 但如果我在服务器端拔下电缆,当客户端和服务器连接并运行时,双方的监视器都无法检测到“断开连接”事件。

显示器的设计是这样的吗?

如果是,除了心跳之外,是否有任何解决方案可以检测网络故障(电缆拔出事件)?

如果没有,如何使用ZeroMQ的原始监控机制来解决这个问题? setTCPKeepAlive()界面可以有用吗?

B中。系统环境

我的情况如下。

客户端

操作系统:Android,在平板电脑上运行,IDE:Android studio 2.3,lib:jeromq-0.4.3

// Java Code

String monitorAddr = "inproc://client.req";
ZContext ctx = new ZContext();
ZMQ.Socket clientSocket = ctx.createSocket(ZMQ.REQ);
clientSocket.monitor(monitorAddr,ZMQ.EVENT_ALL);

// Then start a montitor thread which is implemented by my own. 

服务器

操作系统:Windows 7(64位),在我的笔记本电脑上运行,IDE:VS2013,lib:Clrzmq4

// C# Code

const string MonitorEndpoint = "inproc://server.rep";

var ctx = new ZContext();
var serverSocket = new ZSocket(ctx,ZSocketType.REP);
ZError error;

// Create serverSocket pair socket
if (!serverSocket.Monitor(MonitorEndpoint, ZMonitorEvents.AllEvents, out error))
{

    if (error == ZError.ETERM)
          return ;    // Interrupted
    throw new ZException(error);
}

// Create a monitor
ZMonitor _monitor = ZMonitor.Create(ctx, MonitorEndpoint);
_monitor.AllEvents += _monitor_AllEvents;
_monitor.Start();

1 个答案:

答案 0 :(得分:2)

AFAIK ZeroMQ内部没有内置心跳。我知道几年前在ZMQ社区内就这个话题进行了一些讨论,而且讨论可能仍在继续。

在您的应用程序使用ZeroMQ中加入您自己的心跳消息是相对简单的,特别是如果您使用类似Google协议缓冲区的内容来编码不同的消息类型;心跳只是另一个信息。

在您的应用程序中执行心跳(而不是依赖于某些内置机制)最终会更灵活;你可以选择心率,你可以选择心跳失败时做什么,你可以决定心跳何时重要而不重要等等。

考虑PUB / SUB模式中的心跳; ZMQ作者有点难以代表您决定哪些连接/断开/连接中断事件对您很重要。如果他们确实构建了一个机制,但是应用程序开发人员不想要它,那么它就是浪费带宽。

ZMQ作者更容易将这种应用程序体系结构问题留给应用程序作者(就是你!)来处理。

根据您的具体示例,未插入的网络电缆只是看起来(只要任何软件可以确定),就像没有流量一样;它与不发送任何内容的应用程序相同。如果应用程序没有发送任何内容,ZMQ不会发送任何内容。

如果你看一下套接字监视器可以报告的事件,它们都是流过网络连接的东西的结果,或者是应用程序对套接字做了什么。