【问题标题】:How do I obtain the client's IPv6 address in the Akka/Spray framework?如何在 Akka/Spray 框架中获取客户端的 IPv6 地址?
【发布时间】:2015-09-25 17:21:37
【问题描述】:

我目前正在使用以下代码获取 IPv4 地址:

import spray.http.RemoteAddress
...
val ipV4: String = remoteAddress.toOption.map(_.getHostAddress).getOrElse("<unknown>")

但是,我似乎找不到任何有关为 IPv6 做同样事情的信息。对此的任何帮助将不胜感激。

【问题讨论】:

  • 根据文档,RemoteAddress.toOption 包装了一个java.net.InetAddress,这是一个由 IPv4 和 IPv6 地址扩展的抽象类。假设 remoteAddress 具有 IPv6 地址,您当前的代码应该可以正常工作。
  • @IanMcLaird 啊。好的。那么,如何获取远程地址的 IPv6 版本(与当前提供的 IPv4 相对)?
  • 在只能通过 IPv6 访问的机器上运行代码。您不需要更改代码。您将获得远程机器连接的地址。它一次只能从一个地址连接到您。

标签: scala akka ipv6 spray ipv4


【解决方案1】:

这不取决于您的方法 - 它取决于您的网络配置。

Look at the source codespray.http.RemoteAddress

def apply(bytes: Array[Byte]): RemoteAddress = {
    require(bytes.length == 4 || bytes.length == 16)
    try IP(InetAddress.getByAddress(bytes)) catch { case _: UnknownHostException ⇒ Unknown }
}

此代码包含 IPv4(4 字节)和 IPv6(16 字节)。因此,您将收到 IPv4 地址、IPv6 地址或特殊的 Pv4 映射到 IPv6 地址,具体取决于您的网络设置。

尝试在网络接口配置为使用 IPv6 的本地电脑上运行您的代码,您会看到。

这是您实际从 Java 收到的对象:http://docs.oracle.com/javase/8/docs/api/java/net/InetAddress.html

【讨论】:

  • 我不确定这是否能回答我的问题。您的回答暗示我的代码正在接收 InetAddress 的 IPv4 实例。那么,如何从 Akka/Spray 框架中获取 InetAddress 的 IPv6 实例?
  • 同理。它不取决于您的方法 - 它取决于您的网络配置。尝试在网络接口配置为使用 ipv6 的本地 pc 上运行您的代码,您会看到。
  • 如果您更新您的答案,包括您在评论中所说的内容,我会接受。和 tysvm 用于创建答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2015-10-03
  • 2021-12-03
  • 1970-01-01
  • 2012-03-14
  • 2012-02-16
  • 2017-10-28
相关资源
最近更新 更多