【问题标题】:How to get my public IP from XMPP bind message?如何从 XMPP 绑定消息中获取我的公共 IP?
【发布时间】:2011-05-26 14:13:10
【问题描述】:

我正在编写 Android 应用程序,需要知道我的公共 IP。在我的应用程序中,我使用 Smack 库与 XMPP 服务器进行对话(不仅需要知道我的 IP)

绑定消息,从服务器收到如下:

<iq id="_xmpp_bind1" type="result">
   <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
      <jid>user@jabber.example.com/Smack</jid>
   </bind>
</iq>

但我正在等待它看起来像:

<iq id="_xmpp_bind1" type="result">
    <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
       <jid>user@jabber.example.com/11.22.33.44:12345</jid
    </bind>
</iq>

应该是我的公共 IP 而不是 11.22.33.44。

【问题讨论】:

  • 因此,根据您在下面的回答,您的问题实际上是“如何让服务器在绑定期间为我分配 JID 资源”?而且您没有提到您有一个自定义服务器,它将用户的 IP 地址分配为资源。

标签: android xmpp ip public smack


【解决方案1】:

您使用的是什么 XMPP 服务器?

您可能希望以不同于您提议的方式解决此问题。您的方法会将您的真实 IP 地址泄露给您名册上的每个人。例如,对http://ifconfig.me/ 的 HTTP 请求将轻松返回您的外部 IP 地址。

【讨论】:

  • 我连接到我自己的服务器,但名册不包含来自真实的人。它只有一个伙伴,它是一个机器人 :) 所以泄露 IP 地址并不是一件坏事。
  • 在使用像ifconfig.me 这样的辅助服务方面 - 这是一个合理的决定,但不是最好的。在这种情况下,我的应用程序变得依赖于辅助服务。并且会产生额外的流量(返回的页面不是很重,但是有很多无用的数据)
【解决方案2】:

我找到了问题的原因。我的 Smack 库本身会触发服务器发送此类绑定响应。

它发送这样的绑定请求:

<iq id="Um486-7" type="set">
   <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
      <resource>Smack</resource>
   </bind>
</iq>

所以资源是由 Smack 的绑定请求明确指定的。 使用方法时会出现这种情况:

public void login (String username, String password)

为了避免这种行为,应该使用下一个方法:

public void login (String username, String password, String resource)

并且resource 应设置为null

【讨论】:

  • 您还可以将服务器配置为忽略来自客户端的请求绑定参数,并始终发送自定义 IP 相关资源。
猜你喜欢
  • 1970-01-01
  • 2018-02-17
  • 2016-02-21
  • 2012-04-07
  • 2017-06-14
  • 1970-01-01
  • 2011-05-14
  • 2020-06-06
  • 1970-01-01
相关资源
最近更新 更多