From 189a787d364eeb4cb260311fae86dfd9f1520f34 Mon Sep 17 00:00:00 2001 From: "PSp..om" Date: Sat, 16 Apr 2011 00:13:25 +0000 Subject: [PATCH] Added some warning for some odd state issues that can happen in real life. Fixed a subtle bug with the UDP endpoints where they weren't getting propery closed. This manifested as the endpoints still getting broadcasts even after Server no longer knew about them. git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7243 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- .../networking/com/jme3/network/base/KernelAdapter.java | 4 ++++ .../com/jme3/network/kernel/udp/UdpEndpoint.java | 9 ++++++++- .../com/jme3/network/kernel/udp/UdpKernel.java | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/engine/src/networking/com/jme3/network/base/KernelAdapter.java b/engine/src/networking/com/jme3/network/base/KernelAdapter.java index 680efa96e..1a266d928 100644 --- a/engine/src/networking/com/jme3/network/base/KernelAdapter.java +++ b/engine/src/networking/com/jme3/network/base/KernelAdapter.java @@ -142,6 +142,10 @@ public class KernelAdapter extends Thread try { HostedConnection source = getConnection(p); + if( source == null ) { + log.log( Level.WARNING, "Recieved message from unconnected endpoint:" + p + " message:" + m ); + return; + } messageDispatcher.messageReceived( source, m ); } catch( Exception e ) { reportError(e); diff --git a/engine/src/networking/com/jme3/network/kernel/udp/UdpEndpoint.java b/engine/src/networking/com/jme3/network/kernel/udp/UdpEndpoint.java index 306674807..acb681cb4 100644 --- a/engine/src/networking/com/jme3/network/kernel/udp/UdpEndpoint.java +++ b/engine/src/networking/com/jme3/network/kernel/udp/UdpEndpoint.java @@ -53,6 +53,7 @@ public class UdpEndpoint implements Endpoint private SocketAddress address; private DatagramSocket socket; private UdpKernel kernel; + private boolean connected = true; // it's connectionless but we track logical state public UdpEndpoint( UdpKernel kernel, long id, SocketAddress address, DatagramSocket socket ) { @@ -85,6 +86,7 @@ public class UdpEndpoint implements Endpoint try { kernel.closeEndpoint(this); + connected = false; } catch( IOException e ) { throw new KernelException( "Error closing endpoint for socket:" + socket, e ); } @@ -102,11 +104,16 @@ public class UdpEndpoint implements Endpoint public boolean isConnected() { - return socket.isConnected(); + // The socket is always unconnected anyway so we track our + // own logical state for the kernel's benefit. + return connected; } public void send( ByteBuffer data ) { + if( !isConnected() ) { + throw new KernelException( "Endpoint is not connected:" + this ); + } try { DatagramPacket p = new DatagramPacket( data.array(), data.position(), data.remaining(), address ); diff --git a/engine/src/networking/com/jme3/network/kernel/udp/UdpKernel.java b/engine/src/networking/com/jme3/network/kernel/udp/UdpKernel.java index 904a407f2..6a1669243 100644 --- a/engine/src/networking/com/jme3/network/kernel/udp/UdpKernel.java +++ b/engine/src/networking/com/jme3/network/kernel/udp/UdpKernel.java @@ -128,7 +128,7 @@ public class UdpKernel extends AbstractKernel // Does it match the filter? if( filter != null && !filter.apply(p) ) continue; - + // Send the data p.send( data ); }