macos - Akka,发送 Udp 失败, "Can' t 分配请求的地址”

标签 macos sockets udp akka

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

[akka://udp-test/system/IO-UDP-FF/selectors/$a/0] Successfully bound to [/127.0.0.1:64387]
Sending msg: bla
[akka://udp-test/system/IO-UDP-FF/selectors/$a/0] Can't assign requested address
[akka://udp-test/system/IO-UDP-FF/selectors/$a/0] Closing DatagramChannel after being stopped


如上失败如果目标地址是公共(public) IP,例如 62.138.0.158或在本地网络中,如 192.168.2.3 , 两者都响应 ping .
成功 如果目标地址是127.0.0.1 (本地主机)在任何端口上。
成功 在本地网络中将本地地址更改为我当前的 ip 后(例如:192.168.2.2)
失败不同对于无效的 ip

[akka://default/system/IO-UDP-FF/selectors/$a/1] Name resolution failed for remote address [invalid-ip:6969]


成功 如果我完全按照 Simple Send in the docs反而。即,使用 Bind替换为 SimpleSender .但我还需要在同一个端口上监听,我希望它可以作为 Bind (and Send) 的文档工作。说:

Sending datagrams is achieved by using the Send message



复制:
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 上运行。

最佳答案

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

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

  • 127.0.0.1环回接口(interface)
  • 一个 192.168.x.x在本地网络中,与路由器通话。

  • 通过专门绑定(bind)到 127.0.0.1我不会收到来自外部的数据包,地址是我的 192.168.x.x知识产权。所以听“所有这些”是有道理的。

    我的代码现在可以正常工作,但我仍然不明白为什么在发送时会发生此错误。

    关于macos - Akka,发送 Udp 失败, "Can' t 分配请求的地址”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47381045/

    相关文章:

    objective-c - 设置 NSTask 工作目录

    macos - 在 mac 10.9 中安装 libgd 时出错

    java - 如何在线程中向 JTextArea 追加新数据?

    vb.net - 在 VB.NET 中通过 TCP/IP 发送数据时程序卡住

    multithreading - C# : UDP Listener Thread

    sockets - D receiveFrom没有收到完整的数据包

    c - "<>"缺失有什么问题

    java - 无法在 Mac 上安装 Glassfish。它表示指定的目录不是有效的 GlassFish 安装

    mysql - 无法与 MacOS 上运行的 MySQL 建立连接

    c - UDP 段错误