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

时间:2017-11-19 19:24:22

标签: macos sockets udp akka

尝试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等公共广告网络,或者是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上运行。

1 个答案:

答案 0 :(得分: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。因此,倾听“所有人”是有道理的。

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