Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 0MQ-获取消息ip_C++_Sockets_Zeromq - Fatal编程技术网

C++ 0MQ-获取消息ip

C++ 0MQ-获取消息ip,c++,sockets,zeromq,C++,Sockets,Zeromq,首先,我要感谢你的精彩表演!我喜欢它。客户端正在将自己连接到服务器。服务器应该保存IP并在以后处理它(我真的需要IP)。我找到了答案:但我不明白如何从消息中获取IP(一个XREP)。。。我想我只能读取ID,但IP由0MQ内部管理。他的第二个解决方案建议将IP作为消息的一部分发送,但我不知道如何获取“公共”IP。我发现这篇文章: 我不明白这是怎么回事。他指的是网络服务吗? 在我看来,最好从0MQ中获取IP(它已经有了IP)。我甚至会为此调整0MQ,如果有人可以指出IP保存的位置,但找不到它。目前,

首先,我要感谢你的精彩表演!我喜欢它。客户端正在将自己连接到服务器。服务器应该保存IP并在以后处理它(我真的需要IP)。我找到了答案:但我不明白如何从消息中获取IP(一个XREP)。。。我想我只能读取ID,但IP由0MQ内部管理。他的第二个解决方案建议将IP作为消息的一部分发送,但我不知道如何获取“公共”IP。我发现这篇文章:

我不明白这是怎么回事。他指的是网络服务吗?
在我看来,最好从0MQ中获取IP(它已经有了IP)。我甚至会为此调整0MQ,如果有人可以指出IP保存的位置,但找不到它。目前,套接字类型并不那么重要。我更喜欢smth REQ-REP。谢谢大家!

ZeroMQ的设计方式在远程IP上没有提供任何信息。据我所知,您必须通过应用程序管理这些信息,将这些信息作为某种消息发送


消息本身使用与IP无关的ID,该ID与ZeroMQ运行实例的关系大于任何特定接口。这是因为连接这两个实例的传输方法和接口可能不止一种。

摘要:

TL;DR对您的问题的回答是:您无法使用ZeroMQ API获取发送消息的对等方的IP地址

说明:

ZeroMQ不公开对等IP地址,因为它与ZeroMQ设计用于的基于消息的通信无关。当ZeroMQ可以获取连接到服务器的客户端的IP地址时(在示例中使用描述的方法),它是无用的。这里的详细解释是它如何在ZeroMQ和任何其他服务器实现中工作

连接的服务器端不通过将IP映射到客户端的哈希表来处理连接的客户端,而是通过跟踪连接的“套接字”(套接字描述符)——当服务器接受(使用accept())连接时,它从操作系统套接字描述符接收,以用于与连接的对等方通信。服务器所要做的就是保留该描述符,以便从该客户端读取()并向其写入()。连接到服务器的另一个客户端接收另一个套接字描述符


总而言之:即使ZeroMQ能够为您提供连接对等方的IP,您也不应该依赖它。ZeroMQ对您的连接管理隐藏,因此您可以专注于消息传递。连接管理包括重新连接,这可能会导致IP的更改,而不会更改另一端连接的实际ZeroMQ套接字。

因此,下面是一个示例,说明为什么您可能希望获取发送消息的IP地址:我们有一台服务器,其任务是将更新同步到偶尔连接的客户端(考虑一下这里的移动设备,尽管这是移动设备的一个极端例子。)

当移动设备进入网络时,它通过经销商路由器连接向服务器发送其固件文件列表。服务器具有所有适用固件文件的列表;如果客户端需要更新,它将通过单独的机制启动更新

由于设备的IP可以(并且确实)更改,因此我们需要知道与此连接的移动设备关联的IP地址,即现在


是的,我们绝对可以让客户端在消息中发送它的IP地址,但这又浪费了n字节宝贵的卫星广播时间,虽然不是纯粹的邪恶,但确实很烦人。Zmq已经有了这些信息,如果没有,它将无法生成回复。地址在套接字数据中,没有理由拒绝我ssage不能(也可以选择,对于所有使用有线网络并认为断开连接是例外的人)包括对套接字结构的引用,以便从中获取地址。除了学究式的虔诚,这在zmq中太常见了。

是的,但不知何故,0MQ必须知道客户端的IP,它必须将响应发送到…据我所知,0MQ使用哈希表,其中它使用ID作为IP的键。ZeroMQ知道,但我知道我从未在API中看到任何允许您访问该信息的内容。我曾在邮件列表中看到这一点,但得到的答复只是对“fabric”的模糊抱怨还有你不应该知道的。你能更详细地解释一下为什么你可能特别需要IP吗?ZMQ从一开始就被设计用来提取这些低级信息。你可能试图用ZMQ错误地解决问题。我确实需要IP。我们不必说我是否需要IP,我们来谈谈h我如何获得IP.:)对我来说,这似乎是A/B问题,你问的问题的解决方案不是你正在努力解决的真正问题。所以我要重复S.里士满的问题:你需要IP做什么?您想解决什么问题?例如:您有一台服务器,它拥有一个大厅。连接后,您将收到其他客户端的IP,您可以开始使用对等连接,而不再通过服务器发送数据。我确实认为标志
ZMQ\u SRCFD
可以解决此问题。。。查看
$ZMQ_SOURCES/tests/test_srcfd.cpp中的一个示例,谢谢您的回答,但正如您看到的,必须能够获得ip。此外,我还找到了
bool get\u peer\u ip\u地址(fd\u t sockfd\u,std::string&ip\u addr\u)
ip.hpp
中,但不知何故我无法使用它(头不在includepath中,如果我添加了它,它仍然没有在库中编译)。如果您可以将该信息包括在您的答案中(如果有效:),我将对其进行标记。您将无法使用get_peer_ip_address,因为它由ZeroMQ 4.0提供的用于授权目的的流套接字内部使用-您可以授权b
 is pass bind a service to an ephemeral port, get a full connection endpoint ("tcp://ipaddress:port")