Akka,发送Udp失败,“无法分配请求的地址”

问题描述 投票:0回答:1

尝试Bind (and Send) as in the docs但它失败了:

[akka:// udp-test / system / IO-UDP-FF / selectors / $ a / 0]成功绑定到[/127.0.0.1:64387] 发送消息:bla [akka:// udp-test / system / IO-UDP-FF / selectors / $ a / 0]无法分配请求的地址 [akka:// udp-test / system / IO-UDP-FF / selectors / $ a / 0]停止后关闭DatagramChannel

如果目标地址是像62.138.0.158这样的公共IP,或者像192.168.2.3这样的本地网络,这两个都响应ping,就会失败。

如果目标地址是任何端口上的127.0.0.1(localhost),则成功。

将本地地址更改为本地网络中当前的IP后成功(例如:192.168.2.2

对于无效的ip,失败的方式不同

[akka:// default / system / IO-UDP-FF / selectors / $ a / 1]远程地址名称解析失败[invalid-ip:6969]

如果我完全像Simple Send in the docs那样成功,那就成功了。即,Bind取代了SimpleSender。但是我也需要在同一个端口收听,我希望它可以像Bind (and Send)的文档那样工作:

使用发送消息可以发送数据报


重现:

import java.net.InetSocketAddress

import akka.actor.{Actor, ActorRef, ActorSystem, Props}
import akka.io.{IO, Udp}
import akka.io.Udp.Send
import akka.util.ByteString

object Main extends App {

  val system = ActorSystem("udp-test")

  val destAddr = new InetSocketAddress("62.138.0.158", 6969)
  private val props = Props(classOf[Listener], destAddr)
  val udp: ActorRef = system.actorOf(props, "udp-actor")

  Thread.sleep(500) //give time for the actor to be created
  udp ! "bla"

}

class Listener(remote: InetSocketAddress) extends Actor {
  import context.system
  IO(Udp) ! Udp.Bind(self, new InetSocketAddress("localhost", 0))

  def receive = {
    case Udp.Bound(local) =>
      context.become(ready(sender()))
    case other =>
      println(s"Received something else: $other")
  }

  def ready(socket: ActorRef): Receive = {
    case msg: String =>
      println(s"Sending msg: $msg")
      socket ! Send(ByteString(msg), remote)
    case other =>
      println(s"Received something else: $other")
  }
}

我在运行macOS。

macos sockets udp akka
1个回答
0
投票

在将本地地址设置为0.0.0.0后解决,意思是“listen on every available network interface”。

我有两个网络接口,每个接口都有一个IP地址:

  • 127.0.0.1在loopback接口上
  • 在本地网络中使用192.168.x.x,与路由器通信。

通过专门绑定到127.0.0.1我不会得到来自外部的数据包,发送到我的192.168.x.x IP。因此,倾听“所有人”是有道理的。

我的代码现在工作正常,但我仍然不明白发送时出现此错误的原因。

© www.soinside.com 2019 - 2024. All rights reserved.