2016-06-20 3 views
0

Ich benutze akka.net.Udp, um ein UDP-Paket (Code unten) zu senden. Das Senden an meinen lokalen Rechner (127.0.0.1) funktioniert einwandfrei, aber sobald ich denselben Code mit einer anderen IP-Adresse starte, beschwert sich Akka über "Ungültiges Argument" (Ausgabe unten).Akka UDP: "Ungültiges Argument" beim Senden an ein beliebiges Ziel, das nicht 127.0.0.1 ist

Irgendwelche Ideen was schief geht?

package debug 

import akka.actor.{Actor, ActorLogging, ActorRef, Props} 
import java.net.InetSocketAddress 
import akka.io.{IO, Udp} 
import akka.util.ByteString 


class SocketTest extends Actor with ActorLogging { 

    val dest = new InetSocketAddress("131.179.196.46", 6363)  // Invalid argument 
    // val dest = new InetSocketAddress("127.0.0.1", 6363)   // works fine 
    val udp = context.actorOf(Props(classOf[UDP4]), name="udp4") 

    // send 
    Thread.sleep(1000) 
    udp ! (dest, ByteString("hello world")) 

    Thread.sleep(99999) 
    def receive = {???} 

} 

class UDP4 extends Actor with ActorLogging { 

    val local = new InetSocketAddress("127.0.0.1", 2222) 

    import context.system 
    IO(Udp) ! Udp.Bind(self, local) 

    def receive: Receive = { 
    case Udp.Bound(local) => context.become(ready(sender)) 
    } 

    def ready(connection:ActorRef): Receive = { 
    case (remote:InetSocketAddress, data:ByteString) => { 
     log.info(s"Send to ${remote}: ${data}") 
     connection ! Udp.Send(data, remote) 
    } 
    case Udp.Received(data, remote) => log.info(s"Receive from ${remote}: ${data}") 
    case Udp.Unbind => connection ! Udp.Unbind 
    case Udp.Unbound => context.stop(self) 
    } 

} 

Ausgang mit einem anderen Ziel als lokale Maschine:

[DEBUG] [06/20/2016 11:54:39.753] [main] [EventStream(akka://Main)] logger log1-Logging$DefaultLogger started 
[DEBUG] [06/20/2016 11:54:39.754] [main] [EventStream(akka://Main)] Default Loggers started 
[DEBUG] [06/20/2016 11:54:39.851] [Main-akka.actor.default-dispatcher-2] [akka://Main/system/IO-UDP-FF/selectors/$a/0] Successfully bound to [/127.0.0.1:2222] 
[INFO] [06/20/2016 11:54:40.783] [Main-akka.actor.default-dispatcher-5] [akka://Main/user/app/udp4] Send to /131.179.196.46:6363: ByteString(104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100) 
[DEBUG] [06/20/2016 11:54:40.789] [Main-akka.actor.default-dispatcher-5] [akka://Main/system/IO-UDP-FF/selectors/$a/0] Invalid argument 
[DEBUG] [06/20/2016 11:54:40.791] [Main-akka.actor.default-dispatcher-3] [akka://Main/system/IO-UDP-FF/selectors/$a/0] Closing DatagramChannel after being stopped 

Ausgang mit 127.0.0.1 als Ziel:

[DEBUG] [06/20/2016 11:55:37.213] [main] [EventStream(akka://Main)] logger log1-Logging$DefaultLogger started 
[DEBUG] [06/20/2016 11:55:37.214] [main] [EventStream(akka://Main)] Default Loggers started 
[DEBUG] [06/20/2016 11:55:37.280] [Main-akka.actor.default-dispatcher-4] [akka://Main/system/IO-UDP-FF/selectors/$a/0] Successfully bound to [/127.0.0.1:2222] 
[INFO] [06/20/2016 11:55:38.234] [Main-akka.actor.default-dispatcher-2] [akka://Main/user/app/udp4] Send to /127.0.0.1:6363: ByteString(104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100) 
+0

99% sicher, dass Sie eine IOException mit dem hilfreichen Text "Ungültiges Argument" erhalten. Sie müssen eine feinere Protokollierung aktivieren und offen legen, welche Versionen von Akka, OS usw. Sie verwenden. –

Antwort

1

Das Problem ist in der folgenden Zeile:

val local = new InetSocketAddress("127.0.0.1", 2222) 

Es ist req Nicht nur lokal binden:

val local = new InetSocketAddress("0.0.0.0", 2222) 

Nach dem Ändern dieser Zeile funktioniert der Code wie gewünscht.

Verwandte Themen