首先,我要感谢这个惊人的lib!我喜欢它。客户端将自己连接到服务器。服务器应该保存IP并稍后使用它(我真的需要IP)。我找到答案:http://lists.zeromq.org/pipermail/zeromq-dev/2010-September/006381.html但我不明白我是如何从消息中获取IP的(XREP)...我认为我只能读取ID,但IP是由内部管理的0MQ。他的第二个解决方案建议将IP作为消息的一部分发送,但我不明白如何获得“公共”-IP。我发现帖子:Get TCP address information in ZeroMQ
is pass bind a service to an ephemeral port, get a full connection endpoint ("tcp://ipaddress:port")
我不明白这是怎么回事。他的意思是网络服务吗? 在我看来,最好将IP从0MQ中取出(它已经拥有IP)。我甚至会调整0MQ,如果有人可以指向保存IP的地方,找不到它。目前,套接字类型并不重要。我更喜欢smth REQ-REP之类的。谢谢!
答案 0 :(得分:13)
<强>要点:强>
TL; DR回答您的问题是:您无法使用ZeroMQ API获取发送消息的对等方的IP地址。
<强>解释强>
ZeroMQ不公开对等IP地址,因为它与ZeroMQ设计的基于消息的通信无关。当ZeroMQ可以获取连接到服务器的客户端的IP地址时(例如使用描述为here的方法),它是无用的。对于更长的解释,这里是它如何在ZeroMQ和任何其他服务器实现中工作。
连接的服务器端不能通过将IP映射到客户端的哈希表来处理连接的客户端,而是通过跟踪连接的“套接字”(套接字)描述符) - 当服务器接受(使用accept())连接时,它从操作系统套接字描述符接收用于与连接的对等体通信。所有服务器要做的就是将该描述符保持为read()from和write()到该客户端。另一个连接到服务器的客户端接收另一个套接字描述符。
总结一下:即使ZeroMQ能够为您提供连接对等体的IP,您也不应该依赖它。 ZeroMQ隐藏了您的连接管理,因此您可以专注于消息传递。连接管理包括重新连接,这可能会导致IP更改而不会更改另一端连接的实际ZeroMQ插槽。
答案 1 :(得分:5)
所以这里有一个例子,说明为什么你可能希望获得一个消息来自的IP地址:我们有一个服务器,它的工作是将更新同步到偶尔连接的客户端(想想这里的移动设备,尽管这是一个极端移动设备的例子。)
当移动设备进入网络时,它会通过经销商路由器连接向服务器发送其固件文件列表。服务器有一个包含所有适用固件文件的列表;如果客户端需要更新,它将通过单独的机制启动更新。
由于设备的IP可以(并且确实)发生变化,我们需要知道与此移动设备相关的IP地址,即现在。
是的,我们绝对可以让客户端在消息中发送它的IP地址,但这浪费了另外n个字节的宝贵卫星播出时间,虽然不是纯粹的邪恶,但肯定很烦人。 Zmq已经拥有此信息,如果没有,则无法生成回复。地址在套接字数据中,没有理由没有消息(可选地,对于所有使用有线网络并认为断开连接的人都是例外)包括对套接字结构的引用,以便您可以从中获取地址。除了迂腐的宗教信仰,这在zmq中太常见了。
答案 2 :(得分:3)
ZeroMQ的设计方式是远程IP上没有提供信息。据我所知,您必须通过将该信息作为某种消息发送来通过您的应用程序来管理它。
消息本身使用与IP无关的ID,与任何特定接口运行的ZeroMQ实例有更多关系。这是因为可能有多个传输方法和接口连接这两个实例。