【发布时间】:2022-08-03 15:29:59
【问题描述】:
我正在寻找一种更好的方法来检测路由器/服务器出现故障或由于连接不良而无法使用时的断开连接。 (我正在收听在 wifi 上运行的经销商/客户端)我找到了 zmq_socket_monitor() 并发现 NetMQ 具有相同的功能。我从文档中的理解是,当您监视套接字时,您会给它一个 inproc 地址,它会通知您使用该地址的任何套接字更改。除了unit tests,我真的找不到NetMQMonitor 的任何示例,我的问题是我在下面的代码中是否正确使用了它?与 NetMQPoller 一起使用是否有效?
// run poller on a separate thread
_poller = new NetMQPoller { _dealer, _subscriber, _outgoingMessageQueue, _subscriptionChanges};
_poller.RunAsync();
// run a monitor listening for Connected and Disconnected events
_monitor = new NetMQMonitor(_dealer, \"inproc://rep.inproc\", SocketEvents.Disconnected | SocketEvents.Connected);
_monitor.EventReceived += _monitor_EventReceived;
_monitor.StartAsync();
**** 更新 ****
所以...在发布此内容后,我在NetMQPoller tests on github 中找到了答案,因此可以回答您是否可以将 NetMQMonitor 与 NetMQPoller 一起使用,但我仍然很好奇是否有人对使用监视器的整体方法有想法跟踪连接状态。这是任何有兴趣的人的相关代码:
[Fact]
public void Monitoring()
{
var listeningEvent = new ManualResetEvent(false);
var acceptedEvent = new ManualResetEvent(false);
var connectedEvent = new ManualResetEvent(false);
using (var rep = new ResponseSocket())
using (var req = new RequestSocket())
using (var poller = new NetMQPoller())
using (var repMonitor = new NetMQMonitor(rep, \"inproc://rep.inproc\", SocketEvents.Accepted | SocketEvents.Listening))
using (var reqMonitor = new NetMQMonitor(req, \"inproc://req.inproc\", SocketEvents.Connected))
{
repMonitor.Accepted += (s, e) => acceptedEvent.Set();
repMonitor.Listening += (s, e) => listeningEvent.Set();
repMonitor.AttachToPoller(poller);
int port = rep.BindRandomPort(\"tcp://127.0.0.1\");
reqMonitor.Connected += (s, e) => connectedEvent.Set();
reqMonitor.AttachToPoller(poller);
poller.RunAsync();
req.Connect(\"tcp://127.0.0.1:\" + port);
req.SendFrame(\"a\");
rep.SkipFrame();
rep.SendFrame(\"b\");
req.SkipFrame();
Assert.True(listeningEvent.WaitOne(300));
Assert.True(connectedEvent.WaitOne(300));
Assert.True(acceptedEvent.WaitOne(300));
}
}