Author: elecharny
Date: Thu Feb 11 23:44:58 2010
New Revision: 909179

URL: http://svn.apache.org/viewvc?rev=909179&view=rev
Log:
Added a better fix than just switching to a ipV4 address. However, it's an 
horrific hack. I think that there is something broken on IPV4/IPV6 java 
handling on linux. To be double checked

Modified:
    
mina/trunk/core/src/main/java/org/apache/mina/core/polling/AbstractPollingConnectionlessIoAcceptor.java
    
mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramSessionIdleTest.java

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/core/polling/AbstractPollingConnectionlessIoAcceptor.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/core/polling/AbstractPollingConnectionlessIoAcceptor.java?rev=909179&r1=909178&r2=909179&view=diff
==============================================================================
--- 
mina/trunk/core/src/main/java/org/apache/mina/core/polling/AbstractPollingConnectionlessIoAcceptor.java
 (original)
+++ 
mina/trunk/core/src/main/java/org/apache/mina/core/polling/AbstractPollingConnectionlessIoAcceptor.java
 Thu Feb 11 23:44:58 2010
@@ -19,6 +19,10 @@
  */
 package org.apache.mina.core.polling;
 
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.net.SocketAddress;
 import java.util.Collections;
 import java.util.HashMap;
@@ -69,8 +73,8 @@
     private final Queue<AcceptorOperationFuture> cancelQueue =
         new ConcurrentLinkedQueue<AcceptorOperationFuture>();
     private final Queue<T> flushingSessions = new ConcurrentLinkedQueue<T>();
-    private final Map<SocketAddress, H> boundHandles =
-        Collections.synchronizedMap(new HashMap<SocketAddress, H>());
+    private final Map<String, H> boundHandles =
+        Collections.synchronizedMap(new HashMap<String, H>());
 
     private IoSessionRecycler sessionRecycler = DEFAULT_RECYCLER;
 
@@ -82,6 +86,28 @@
     private Acceptor acceptor;
 
     private long lastIdleCheckTime;
+    
+    private String getAddressAsString(SocketAddress address) {
+       InetAddress inetAddress = ((InetSocketAddress)address).getAddress();
+       int port = ((InetSocketAddress)address).getPort();
+       
+       String result = null;
+       
+       if ( inetAddress instanceof Inet4Address ) {
+               result = "/" + inetAddress.getHostAddress() + ":" + port;
+       } else {
+               // Inet6
+               if ( ((Inet6Address)inetAddress).isIPv4CompatibleAddress() ) {
+                       byte[] bytes = inetAddress.getAddress();
+                       
+                       result = "/" + bytes[12] + "." + bytes[13] + "." + 
bytes[14] + "." + bytes[15] + ":" + port;
+               } else {
+                       result = inetAddress.toString();
+               }
+       }
+       
+       return result;
+    }
 
     /**
      * Creates a new instance.
@@ -232,7 +258,7 @@
 
     private IoSession newSessionWithoutLock(
             SocketAddress remoteAddress, SocketAddress localAddress) throws 
Exception {
-        H handle = boundHandles.get(localAddress);
+        H handle = boundHandles.get(getAddressAsString(localAddress));
         
         if (handle == null) {
             throw new IllegalArgumentException("Unknown local address: " + 
localAddress);
@@ -535,13 +561,13 @@
                 break;
             }
 
-            Map<SocketAddress, H> newHandles = new HashMap<SocketAddress, H>();
+            Map<String, H> newHandles = new HashMap<String, H>();
             List<SocketAddress> localAddresses = req.getLocalAddresses();
             
             try {
                 for (SocketAddress socketAddress : localAddresses) {
                     H handle = open(socketAddress);
-                    newHandles.put(localAddress(handle), handle);
+                    newHandles.put(getAddressAsString(localAddress(handle)), 
handle);
                 }
                 
                 boundHandles.putAll(newHandles);
@@ -582,7 +608,7 @@
 
             // close the channels
             for (SocketAddress socketAddress : request.getLocalAddresses()) {
-                H handle = boundHandles.remove(socketAddress);
+                H handle = 
boundHandles.remove(getAddressAsString(socketAddress));
                 
                 if (handle == null) {
                     continue;

Modified: 
mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramSessionIdleTest.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramSessionIdleTest.java?rev=909179&r1=909178&r2=909179&view=diff
==============================================================================
--- 
mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramSessionIdleTest.java
 (original)
+++ 
mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramSessionIdleTest.java
 Thu Feb 11 23:44:58 2010
@@ -76,7 +76,7 @@
         acceptor.getSessionConfig().setBothIdleTime(BOTH_IDLE_TIME);
         acceptor.getSessionConfig().setReaderIdleTime(READER_IDLE_TIME);
         acceptor.getSessionConfig().setWriterIdleTime(WRITER_IDLE_TIME);
-        InetSocketAddress bindAddress = new InetSocketAddress( "127.0.0.1", 
AvailablePortFinder.getNextAvailable());
+        InetSocketAddress bindAddress = new InetSocketAddress(  
AvailablePortFinder.getNextAvailable());
         acceptor.setHandler(new TestHandler());
         acceptor.bind(bindAddress);
         IoSession session = acceptor.newSession(new InetSocketAddress(


Reply via email to