如何在 C# 中检查 ZMQ 发布者是否存在

How to check ZMQ publisher is alive or not in c#

我在 C# 中使用 ZMQ NetMQ 包来接收来自订阅者的消息。我能够收到消息,但我坚持在 while 循环中。如果发布者停止发送数据,我想打破 while 循环。

这是我的订阅者代码:

using (var subscriber = new SubscriberSocket())
            {
                subscriber.Connect("tcp://127.0.0.1:4000");
                subscriber.Subscribe("A");

                while (true)
                {
                    var msg = subscriber.ReceiveFrameString();
                    Console.WriteLine(msg);
                }

Q : "How to check ZMQ publisher is alive or not in c# ?"

A :
至少有两种方法:

  • a )
    修改PUB端和SUB端的代码,使Publisher同时发送PUB/SUB-channel 消息,并且独立于 PUSH/PULL-keep-alive 消息向 SUB-side 证明它仍然存在,作为来自 [=15= 的确认自动接收]-SUB-侧循环上的访问点。一段时间内未收到此类软keep-alive消息可能会触发SUB端循环以确保break。反向 PUSH/PULL 通道可能会满足相同的原则,其中 SUB 端不时询问 PUB 端,监听 PULL-一边,使用异步发送的 soft-request 消息将软 keep-alive 消息注入 PUB-channel(记住 TOPIC-filter 是左边的普通 ASCII-filtering在 message-payload 的右侧,因此 PUSH 传递的消息可以通过 PUB/SUB 轻松地将 looped-back 的确切文本发送回发件人,匹配本地已知的 TOPIC-filter 由完全相同的 SUB 端实体维护)

  • b )
    在无法修改 PUB 端代码的情况下,我们仍然可以设置一个 time-based 计数器,过期后,没有收到单个消息(无论是使用已知倍数的精确定时-aSUB.poll( ... )-s 的循环,这允许一些 priority-ordered 交错 control-loops 在没有不受控制的相互阻塞,或者使用 non-blocking 形式的 aSUB.recv( zmq.NOBLOCK ) 在循环内对齐,并避免 busy-loop CPU-relieving sleep()-s )。如果发生这种超时,到目前为止还没有收到任何实际消息,我们可以按照上面的要求自动打破 SUB 端循环。

Q.E.D.