如何在 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.
我在 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-relievingsleep()
-s )。如果发生这种超时,到目前为止还没有收到任何实际消息,我们可以按照上面的要求自动打破SUB
端循环。
Q.E.D.