Update of /cvsroot/freenet/freenet/src/freenet/transport
In directory sc8-pr-cvs1:/tmp/cvs-serv8807/src/freenet/transport
Modified Files:
Tag: stable
AbstractSelectorLoop.java ListenSelectorLoop.java
ReadSelectorLoop.java VoidListeningAddress.java
VoidTransport.java WriteSelectorLoop.java tcpAddress.java
tcpConnection.java tcpListeningAddress.java
tcpNIOListener.java tcpTransport.java
Log Message:
5030: Merge minor(ish) changes from unstable:
Open Connections infolet
Minor implementation changes on normal mode
Show total bytes transmitted/received so far
Much new information on the PeerHandler mode
Fixed tons of eclipse warnings (almost all are style issues, not functional changes -
relating to logger and imports mostly). Remove deprecated FieldSet.add(String,String).
Update TestLocalNIOInterface to current API
Make 5029 mandatory (it can't connect to us anyway, only vice versa).
If incoming HTL is 25, 50% chance of not decrementing it, so we have some plausible
deniability when we send out an HTL 25 request (the client level HTL perturb mechanism
is insufficient although useful).
Don't use seednodes with no physical address.
Use our own URLEncoder/URLDecoder's, catch the exceptions. We were using java's, which
are deprecated.
Add support for deprecated options. These will be read form config file and handled,
but will not be written to it by --config. Currently bandwidthLimit and
averageBandwidthLimit are in this category. Separate code logs an error when these are
set.
Change the way bandwidthLimit set but others not set, to prevent it from constantly
getting 100% load due to bandwidth limit (0!) exceeded.
Set priority of entropy thread to MIN.
Remove old datastore code, GOOD RIDDENS!
Add a memory usage test for the Failure Table
Increase size of failure table to 20,000 (from 2,000).
Don't show the key request form in simple mode on the default infolet.
Major refactoring of HTML reporting, writing to disk, in NGRouting estimators.
Relative times in (for example) ?date= in fproxy: ?date=-1year gives the edition of a
DBR one year ago.
NIO refactoring (ASL.ChannelAttachmentPairQueue).
Logging.
Index: AbstractSelectorLoop.java
===================================================================
RCS file: /cvsroot/freenet/freenet/src/freenet/transport/AbstractSelectorLoop.java,v
retrieving revision 1.15.2.18
retrieving revision 1.15.2.19
diff -u -w -r1.15.2.18 -r1.15.2.19
--- AbstractSelectorLoop.java 28 Oct 2003 20:20:48 -0000 1.15.2.18
+++ AbstractSelectorLoop.java 1 Nov 2003 16:55:37 -0000 1.15.2.19
@@ -21,7 +21,10 @@
*/
public abstract class AbstractSelectorLoop implements SelectorLoop{
- protected LinkedList registerWaiters, unregisterWaiters, delayedWaiters;
+ //protected LinkedList registerWaiters, unregisterWaiters, delayedWaiters;
+ protected ChannelAttachmentPairQueue registerWaiters= new
ChannelAttachmentPairQueue();
+ protected ChannelAttachmentPairQueue unregisterWaiters= new
ChannelAttachmentPairQueue();
+ protected ChannelAttachmentPairQueue delayedWaiters= new
ChannelAttachmentPairQueue();
protected Selector sel;
protected Set currentSet;
@@ -106,9 +109,6 @@
public AbstractSelectorLoop() throws IOException{
sel = Selector.open();
- registerWaiters = new LinkedList();
- unregisterWaiters = new LinkedList();
- delayedWaiters = new LinkedList();
stop = false;
cleanupNeeded=false;
timeout = TIMEOUT;
@@ -146,6 +146,38 @@
attachment.toString());
}
}
+ /**
+ * a synchronized queue that accepts single or bunched ChannelAttachmentPair:s
and returns a list containing all items queued
+ */
+ protected class ChannelAttachmentPairQueue {
+ private LinkedList queue = new LinkedList();
+ private Object queueLock = new Object();
+
+ //Adds the ChannelAttachmentPair to the queue
+ void add(ChannelAttachmentPair cap) {
+ synchronized(queueLock){
+ queue.add(cap);
+ }
+ }
+ void addAll(LinkedList l) {
+ synchronized(queueLock){
+ queue.addAll(l);
+ }
+ }
+ //Returns and flushes the current queue
+ //If no items is queued then null is returned
+ LinkedList get() {
+ //Avoid locking and allocation if we dont have any items queued
+ //There shuldn't be any real drawback with keeping this check
unsynchronized
+ if(queue.size()==0)
+ return null;
+ synchronized(queueLock){
+ LinkedList retval = queue;
+ queue = new LinkedList();
+ return retval;
+ }
+ }
+ }
protected final class DelayedChannelAttachmentPair extends
ChannelAttachmentPair {
public final long registerTime;
@@ -186,9 +218,8 @@
}
//minimize the number of exceptions in the select thread, check early
if (ch.isBlocking()) throw new IllegalBlockingModeException();
- synchronized(registerWaiters) {
registerWaiters.add(new ChannelAttachmentPair(ch, attachment));
- }
+
}
public final void register(Socket sock, Object attachment) throws
IllegalBlockingModeException {
@@ -201,19 +232,15 @@
if(logDebug)
Core.logger.log(this, "Unregistering "+chan,
new Exception("debug"),
Logger.DEBUG);
- synchronized(unregisterWaiters) {
unregisterWaiters.add(new ChannelAttachmentPair(chan,null));
}
- }
public final void unregister(Object attachment) {
if(logDebug)
Core.logger.log(this, "Unregistering "+attachment,
new Exception("debug"),
Logger.DEBUG);
- synchronized(unregisterWaiters) {
unregisterWaiters.add(new
ChannelAttachmentPair(null,attachment));
}
- }
public final boolean isOpen() {
return sel.isOpen();
@@ -240,40 +267,40 @@
*/
protected final void processWaiters() {
- while (delayedWaiters.size() > 0) {
+ LinkedList waitersToProcess = delayedWaiters.get();
+ while (waitersToProcess != null && waitersToProcess.size() > 0) {
DelayedChannelAttachmentPair current =
- (DelayedChannelAttachmentPair)
delayedWaiters.removeFirst();
+ (DelayedChannelAttachmentPair)
waitersToProcess.removeFirst();
if (System.currentTimeMillis() >= current.registerTime)
registerWaiters.add(current);
else
- delayedWaiters.add(current);
+ delayedWaiters.add(current); //TODO: Would it be
better to avoid a bunch of finegrained put():s by using an putAll() instead
}
//TODO: find a way to get the try's out of the loop
//first add
LinkedList notRegistered = new LinkedList();
- synchronized(registerWaiters) {
- while(registerWaiters.size() >0) {
- ChannelAttachmentPair current =
(ChannelAttachmentPair)registerWaiters.removeFirst();
+ waitersToProcess = registerWaiters.get();
+ while (waitersToProcess != null && waitersToProcess.size() > 0) {
+ ChannelAttachmentPair current = (ChannelAttachmentPair)
waitersToProcess.removeFirst();
if (myKeyOps() == SelectionKey.OP_ACCEPT) //this is a
server socket
try{
current.channel.register(sel,
SelectionKey.OP_ACCEPT, current.attachment);
- }catch(ClosedChannelException e) {continue;}
- else if (myKeyOps() == SelectionKey.OP_READ) {
+ } catch (ClosedChannelException e) {
+ continue;
+ } else if (myKeyOps() == SelectionKey.OP_READ) {
//a reader, writers get registered on the fly
- if(!current.channel.isOpen()) continue;
+ if (!current.channel.isOpen())
+ continue;
if(shouldRegister(current)) {
try {
- if
(current.channel.keyFor(sel) ==null ||
-
!current.channel.keyFor(sel).isValid()) {
-
current.channel.register(sel, SelectionKey.OP_READ,
-
current.attachment);
+ if (current.channel.keyFor(sel) ==
null || !current.channel.keyFor(sel).isValid()) {
+ current.channel.register(sel,
SelectionKey.OP_READ, current.attachment);
((NIOCallback)current.attachment).registered();
}
} catch(ClosedChannelException e) {
if(current.attachment
instanceof NIOCallback)
-
((NIOCallback)current.attachment).
- unregistered();
+ ((NIOCallback)
current.attachment).unregistered();
try {
queueClose(current);
} catch
(IllegalArgumentException x) {
@@ -286,49 +313,45 @@
} catch (CancelledKeyException e) {
//do nothing?
if (logDebug)
-
Core.logger.log(this,"cought "+e,Logger.DEBUG);
+ Core.logger.log(this, "caught
" + e, Logger.DEBUG);
}
} else {
notRegistered.add(current);
}
}
}
- while(!notRegistered.isEmpty()) {
- ChannelAttachmentPair current =
(ChannelAttachmentPair)notRegistered.removeFirst();
- registerWaiters.add(current);
- }
- }
+ registerWaiters.addAll(notRegistered);
//then remove
- synchronized(unregisterWaiters) {
- while (unregisterWaiters.size() >0) {
+
+ waitersToProcess = unregisterWaiters.get();
+ while (waitersToProcess != null && waitersToProcess.size() > 0) {
ChannelAttachmentPair current;
try {
- current =
-
(ChannelAttachmentPair)unregisterWaiters.removeFirst();
+ current = (ChannelAttachmentPair)
waitersToProcess.removeFirst();
} catch (NoSuchElementException e) {
- Core.logger.log(this, "Parallel removal of elements in
"+this+
- "?: "+e, e,
Logger.ERROR);
+ Core.logger.log(this, "Parallel removal of elements in
" + this +"?: " + e, e, Logger.ERROR);
break;
}
if (current.channel!=null) {
//we have a channel
SelectionKey k = current.channel.keyFor(sel);
- if(k != null) k.cancel();
+ if (k != null)
+ k.cancel();
}
// Not used by WSL, so we don't need to tell it
else if (current.attachment!=null) { //we have only the
attachment
Iterator i = sel.keys().iterator();
while(i.hasNext()) {
SelectionKey curKey = (SelectionKey)i.next();
- if(curKey == null) continue;
- if(!curKey.isValid()) continue;
+ if (curKey == null)
+ continue;
+ if (!curKey.isValid())
+ continue;
Object attachment = curKey.attachment();
if(attachment == null) {
if(logDebug)
- Core.logger.log(this, "Key
"+curKey+" has null "+
-
"attachment unregistering "+
-
current, Logger.ERROR);
+ Core.logger.log(this, "Key " +
curKey + " has null " + "attachment unregistering " + current, Logger.ERROR);
curKey.cancel();
} else if
(attachment.equals(current.attachment)) {
curKey.cancel();
@@ -339,7 +362,8 @@
if (current.attachment!=null)
try{
((NIOCallback)current.attachment).unregistered();
- }catch(ClassCastException e) {continue;}
+ } catch (ClassCastException e) {
+ continue;
}
}
}
Index: ListenSelectorLoop.java
===================================================================
RCS file: /cvsroot/freenet/freenet/src/freenet/transport/ListenSelectorLoop.java,v
retrieving revision 1.4.2.8
retrieving revision 1.4.2.9
diff -u -w -r1.4.2.8 -r1.4.2.9
--- ListenSelectorLoop.java 28 Oct 2003 20:20:48 -0000 1.4.2.8
+++ ListenSelectorLoop.java 1 Nov 2003 16:55:37 -0000 1.4.2.9
@@ -2,14 +2,14 @@
package freenet.transport;
//hope this belongs here
-import java.nio.channels.*;
-import java.nio.ByteBuffer;
-import freenet.SelectorLoop;
-import java.net.Socket;
-import java.util.*;
import java.io.IOException;
-import freenet.NIOListener;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.ServerSocketChannel;
+import java.nio.channels.SocketChannel;
+import java.util.Iterator;
+
import freenet.Core;
+import freenet.NIOListener;
import freenet.support.Logger;
/**
Index: ReadSelectorLoop.java
===================================================================
RCS file: /cvsroot/freenet/freenet/src/freenet/transport/ReadSelectorLoop.java,v
retrieving revision 1.17.2.9
retrieving revision 1.17.2.10
diff -u -w -r1.17.2.9 -r1.17.2.10
--- ReadSelectorLoop.java 28 Oct 2003 20:20:48 -0000 1.17.2.9
+++ ReadSelectorLoop.java 1 Nov 2003 16:55:37 -0000 1.17.2.10
@@ -2,19 +2,20 @@
package freenet.transport;
//QUESTION: does this belong in this package?
-import java.nio.channels.*;
+import java.io.IOException;
import java.nio.ByteBuffer;
-import freenet.SelectorLoop;
-import freenet.Connection;
-import freenet.support.io.Bandwidth;
+import java.nio.channels.ClosedChannelException;
+import java.nio.channels.SelectableChannel;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.SocketChannel;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Map;
-// For logging
import freenet.Core;
import freenet.support.Logger;
-
-import java.net.Socket;
-import java.util.*;
-import java.io.IOException;
+import freenet.support.io.Bandwidth;
/**
* a loop that reads and processes message headers.
@@ -30,6 +31,9 @@
private final LinkedList maintenanceQueue;
+ public long totalReadThrottlableBytes = 0;
+ public long totalReadPseudoThrottlableBytes = 0;
+
private class MaintenancePair {
NIOReader attachment;
SocketChannel chan;
@@ -145,8 +149,7 @@
} else {
if(logDebug)
Core.logger.log(this, "Maintenance process returned -1
but not registered on selector, queuing for unregistration", Logger.DEBUG);
- unregisterWaiters.add(new ChannelAttachmentPair
- (chan, current));
+ unregisterWaiters.add(new ChannelAttachmentPair(chan,
current));
}
queueClose((SocketChannel)chan,current);
} else if (status == 0) {
@@ -158,8 +161,7 @@
} else {
if(logDebug)
Core.logger.log(this, "Maintenance process returned 0 but
not registered on selector, queuing for unregistration", Logger.DEBUG);
- unregisterWaiters.add(new ChannelAttachmentPair
- (chan, current));
+ unregisterWaiters.add(new ChannelAttachmentPair(chan,
current));
}
synchronized(dontReregister) {
dontReregister.add(chan);
@@ -374,10 +376,13 @@
//this actually is an error in fixkeys
if(size > 0) {
bytesRead += (size+OVERHEAD);
- if(shouldThrottle)
+ if(shouldThrottle) {
throttledBytesRead += (size+OVERHEAD);
- else if (nc.countAsThrottled())
+ totalReadThrottlableBytes += (size+OVERHEAD);
+ } else if (nc.countAsThrottled()) {
+ totalReadPseudoThrottlableBytes += (size+OVERHEAD);
pseudoThrottledBytesRead += (size+OVERHEAD);
+ }
}
if(logDebug) Core.logger.log(this, "putting "+sc+":"+bumper+
" on bufferMap:"+size+":"+
Index: VoidListeningAddress.java
===================================================================
RCS file: /cvsroot/freenet/freenet/src/freenet/transport/VoidListeningAddress.java,v
retrieving revision 1.1.1.1
retrieving revision 1.1.1.1.6.1
diff -u -w -r1.1.1.1 -r1.1.1.1.6.1
--- VoidListeningAddress.java 13 Jan 2002 05:25:04 -0000 1.1.1.1
+++ VoidListeningAddress.java 1 Nov 2003 16:55:37 -0000 1.1.1.1.6.1
@@ -1,6 +1,7 @@
package freenet.transport;
-import freenet.*;
-import freenet.crypt.DSAPublicKey;
+import freenet.ListenException;
+import freenet.Listener;
+import freenet.ListeningAddress;
/**
* VoidListeningAddresses have no reason for life.
*
Index: VoidTransport.java
===================================================================
RCS file: /cvsroot/freenet/freenet/src/freenet/transport/VoidTransport.java,v
retrieving revision 1.1.1.1.4.2
retrieving revision 1.1.1.1.4.2.2.1
diff -u -w -r1.1.1.1.4.2 -r1.1.1.1.4.2.2.1
--- VoidTransport.java 14 Dec 2002 19:28:51 -0000 1.1.1.1.4.2
+++ VoidTransport.java 1 Nov 2003 16:55:37 -0000 1.1.1.1.4.2.2.1
@@ -1,12 +1,13 @@
package freenet.transport;
-import freenet.*;
-import freenet.crypt.DSAPublicKey;
+import freenet.Address;
+import freenet.ListeningAddress;
+import freenet.Transport;
+
/**
* Void is the transport that is not.
*
* @author oskar
*/
-
public class VoidTransport implements Transport {
/**
Index: WriteSelectorLoop.java
===================================================================
RCS file: /cvsroot/freenet/freenet/src/freenet/transport/WriteSelectorLoop.java,v
retrieving revision 1.16.2.13
retrieving revision 1.16.2.14
diff -u -w -r1.16.2.13 -r1.16.2.14
--- WriteSelectorLoop.java 28 Oct 2003 20:20:48 -0000 1.16.2.13
+++ WriteSelectorLoop.java 1 Nov 2003 16:55:37 -0000 1.16.2.14
@@ -5,16 +5,25 @@
package freenet.transport;
-import java.nio.channels.*;
-import java.nio.*;
-import java.util.*;
import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.ClosedChannelException;
+import java.nio.channels.IllegalBlockingModeException;
+import java.nio.channels.SelectableChannel;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.SocketChannel;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Vector;
+
import freenet.Core;
import freenet.support.BlockingQueue;
import freenet.support.Logger;
import freenet.support.io.Bandwidth;
-import freenet.support.sort.*;
-import freenet.support.Comparable;
+import freenet.support.sort.QuickSorter;
+import freenet.support.sort.SortAlgorithm;
+import freenet.support.sort.VectorSorter;
/**
* a loop that writes data to the network.
@@ -494,8 +503,8 @@
return false;
}
- long totalWrittenThrottlableBytes = 0;
- long totalWrittenPseudoThrottlableBytes = 0;
+ public long totalWrittenThrottlableBytes = 0;
+ public long totalWrittenPseudoThrottlableBytes = 0;
//at this stage the selected set should contain only channels
//that are ready to be written to and have something to be sent.
Index: tcpAddress.java
===================================================================
RCS file: /cvsroot/freenet/freenet/src/freenet/transport/tcpAddress.java,v
retrieving revision 1.4.4.5.2.6
retrieving revision 1.4.4.5.2.7
diff -u -w -r1.4.4.5.2.6 -r1.4.4.5.2.7
--- tcpAddress.java 28 Oct 2003 20:20:48 -0000 1.4.4.5.2.6
+++ tcpAddress.java 1 Nov 2003 16:55:37 -0000 1.4.4.5.2.7
@@ -1,10 +1,14 @@
package freenet.transport;
-import freenet.*;
-import java.net.Socket;
import java.net.InetAddress;
import java.net.UnknownHostException;
-import java.io.IOException;
-import java.util.StringTokenizer;
+
+import freenet.Address;
+import freenet.BadAddressException;
+import freenet.ConnectFailedException;
+import freenet.Connection;
+import freenet.Core;
+import freenet.ListeningAddress;
+import freenet.support.Logger;
/*
This code is part of the Java Adaptive Network Client by Ian Clarke.
@@ -37,7 +41,7 @@
public boolean equals(tcpAddress tcp) {
if(tcp == null) return false;
if(tcp.port != port) return false;
- if(tcp.throttleAll != throttleAll) return false;
+ if(tcpAddress.throttleAll != throttleAll) return false;
if(host == null)
return tcp.hostName.equals(hostName);
else
@@ -113,9 +117,9 @@
if(host == null && hostName != null) {
long startTime = System.currentTimeMillis();
host = InetAddress.getByName(hostName);
- if(Core.logger.shouldLog(Core.logger.DEBUG)) {
+ if(Core.logger.shouldLog(Logger.DEBUG)) {
Core.logger.log(this, "getHostAddress() took "+
- (System.currentTimeMillis()-startTime)+" ms",
Core.logger.DEBUG);
+ (System.currentTimeMillis()-startTime)+" ms",
Logger.DEBUG);
}
}
}
Index: tcpConnection.java
===================================================================
RCS file: /cvsroot/freenet/freenet/src/freenet/transport/tcpConnection.java,v
retrieving revision 1.8.4.6.2.11
retrieving revision 1.8.4.6.2.12
diff -u -w -r1.8.4.6.2.11 -r1.8.4.6.2.12
--- tcpConnection.java 28 Oct 2003 20:20:48 -0000 1.8.4.6.2.11
+++ tcpConnection.java 1 Nov 2003 16:55:37 -0000 1.8.4.6.2.12
@@ -215,7 +215,7 @@
if(!sock.getTcpNoDelay()) {
if(logDEBUG)
Core.logger.log(this, "Disabling Nagle's Algorithm!",
- Core.logger.DEBUG);
+ Logger.DEBUG);
sock.setTcpNoDelay(true);
}
Core.diagnostics.occurrenceContinuous("socketTime",
@@ -241,7 +241,7 @@
// of 1 byte writes
out = new BufferedOutputStream(nioout, streamBufferSize());
if(logDEBUG) Core.logger.log(this, "Not throttling connection",
- Core.logger.DEBUG);
+ Logger.DEBUG);
} else {
byte[] b = sock.getInetAddress().getAddress();
@@ -264,7 +264,7 @@
} else {
if(logDEBUG)
Core.logger.log(this, "Throttling connection",
- Core.logger.DEBUG);
+ Logger.DEBUG);
out = new BufferedOutputStream(nioout, streamBufferSize());
shouldThrottle = true;
enableThrottle();
Index: tcpListeningAddress.java
===================================================================
RCS file: /cvsroot/freenet/freenet/src/freenet/transport/tcpListeningAddress.java,v
retrieving revision 1.1.1.1.4.1.2.3
retrieving revision 1.1.1.1.4.1.2.4
diff -u -w -r1.1.1.1.4.1.2.3 -r1.1.1.1.4.1.2.4
--- tcpListeningAddress.java 23 Jul 2003 16:21:14 -0000 1.1.1.1.4.1.2.3
+++ tcpListeningAddress.java 1 Nov 2003 16:55:37 -0000 1.1.1.1.4.1.2.4
@@ -1,7 +1,10 @@
package freenet.transport;
-import freenet.*;
-import java.net.*;
-import java.io.IOException;
+import java.net.InetAddress;
+
+import freenet.ListenException;
+import freenet.Listener;
+import freenet.ListeningAddress;
+import freenet.NIOListener;
/*
This code is part of the Java Adaptive Network Client by Ian Clarke.
It is distributed under the GNU Public Licence (GPL) version 2. See
Index: tcpNIOListener.java
===================================================================
RCS file: /cvsroot/freenet/freenet/src/freenet/transport/tcpNIOListener.java,v
retrieving revision 1.2.2.1
retrieving revision 1.2.2.2
diff -u -w -r1.2.2.1 -r1.2.2.2
--- tcpNIOListener.java 1 Jul 2003 02:27:18 -0000 1.2.2.1
+++ tcpNIOListener.java 1 Nov 2003 16:55:37 -0000 1.2.2.2
@@ -1,10 +1,14 @@
package freenet.transport;
-import freenet.*;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.ServerSocket;
+import java.net.Socket;
+
+import freenet.ListenException;
+import freenet.ListeningAddress;
+import freenet.NIOListener;
+import freenet.SelectorLoop;
import freenet.interfaces.NIOInterface;
-import java.io.*;
-import java.net.*;
-import freenet.support.Logger;
-import java.nio.channels.*;
/**
Index: tcpTransport.java
===================================================================
RCS file: /cvsroot/freenet/freenet/src/freenet/transport/tcpTransport.java,v
retrieving revision 1.1.1.1.4.4.2.3
retrieving revision 1.1.1.1.4.4.2.4
diff -u -w -r1.1.1.1.4.4.2.3 -r1.1.1.1.4.4.2.4
--- tcpTransport.java 28 Oct 2003 20:20:48 -0000 1.1.1.1.4.4.2.3
+++ tcpTransport.java 1 Nov 2003 16:55:37 -0000 1.1.1.1.4.4.2.4
@@ -1,10 +1,14 @@
package freenet.transport;
-import freenet.*;
-import freenet.support.Logger;
+import java.net.InetAddress;
import java.util.StringTokenizer;
-import java.io.IOException;
-import java.net.*;
+
+import freenet.Address;
+import freenet.BadAddressException;
+import freenet.Core;
+import freenet.ListeningAddress;
+import freenet.Transport;
+import freenet.support.Logger;
/** A tcpTransport is any Transport based on Sockets. Subclasses implementing
* this provide their own socket factories so that there can be a choice
_______________________________________________
cvs mailing list
[EMAIL PROTECTED]
http://dodo.freenetproject.org/cgi-bin/mailman/listinfo/cvs