1

我编写了一个zmq_poll()具有 3 个前端和 3 个后端的 zmq 代理,超时为 -1,这使得它无穷无尽。前端套接字使用面向连接的-transport tcp://-class 并与主机 IP 地址上zmq_bind()的 -ports 相关联,例如.tcptcp://192.168.1.1:1000

zmq_poll( ..., ..., -1 )当我的主机的 IP 地址发生变化时,有什么办法可以打破无限循环?

while(1) {
    zmq_msg_t message;
    zmq_pollitem_t items [] = {
            { frontend1, 0, ZMQ_POLLIN, 0 },
            { backend1,  0, ZMQ_POLLIN, 0 },
    };
    zmq_poll (items, 2, -1);
    if(items[0].revents & ZMQ_POLLIN) {
     ...
    }
    if(items[1].revents & ZMQ_POLLIN) {
     ...
    }
}

我试图轮询类似的事件,ZMQ_POLLIN | ZMQ_POLLERR但是当我手动更改主机的 IP 地址时,它不会从对zmq_poll( ..., ..., -1 ).

4

1 回答 1

1

Q : “主机ip地址变化时如何退出无穷大?”zmq_poll

最好的方法是永远不要承认一段让你失去对工作流程的控制的代码。

TL;博士;

接受一个代码,你会意识到自己变得无能为力并最终依赖于一些(可能永远不会到来的)外部刺激,好吧,一个人不必是阿波罗导航计算机设计师,但永远不敢将这样的代码投入生产。愿意学习关键系统设计课程吗?请随意阅读美国宇航局阿波罗计划英雄玛格丽特·汉密尔顿女士提供的任何内容,她拯救了机组人员免于坠入月球表面。终生的教训来自于这位聪明勇敢的女士在大约 60 年前的表演。


最好的方法:

为自我适应的机会而设计(考虑到达尔文)。

zmq_poll()声明对于空闲周期(没有事件被标记)具有一些与稳定性相关的控制回路延迟的所有用例,比如说对于您已知的控制回路稳定性阈值100 ms具有大约一个~ 10 Hz10 ms大约一个选通,并且~ 100 Hz使用您的空闲循环时间来检测代码中任何和所有此类重要更改并发出软信号,从而有机会在每次事件时有意识地自适应它们。

作为良好设计实践的示例,对更改的接口地址的自适应(实时系统手动 IP 地址更改就是这样)应该也解除所有迄今为止处于活动状态(现在已死).bind()-s,因为这些否则可能会使用一些基于循环和公平队列的Socket()-instances 方法进行干预,现在可能会无限等待耳聋等)

这种对策的清单在这里将是无穷无尽的,但设计非阻塞、自适应代码的理念是相同的。

假设问题会出现,我们唯一不知道的是,它们什么时候出现,从哪个方向出现,以及我们必须费心处理它们的频率。

剩下的就是你的了:o)

于 2020-11-30T12:26:55.450 回答