On 28/09/2012 9:13 AM, Guillaume Nodet wrote:
If you want to be fully asynchronous, you need to use listeners.

sshClient.connect( host, port ).addListener(
new SshFutureListener<ConnectFuture> {
    public void operationComplete( ConnectFuture connect ) {
       ClientSession session = connect.getSession();
       // start authentication process ...
    }
});


Yes, that is the approach I ended up taking. I also created SSHD-190 to reflect the fact that I could not add a SessionListener to the ClientSession instance.

I have now seen the problem again that I mentioned in my earlier email about getting disconnected. The sequence is this:

* Connect to server
* Create local port forwarding tunnel
* Test the local port forwarding tunnel by connecting and immediately disconnecting from the local port, which creates and then destroys channel 0
* Wait exactly 1 minute (some kind of timeout?)
* Server determines that the connection for its channel 0 is no longer present and it sends EOF, which causes the client to disconnect since it no longer has a channel zero

Here is the client log, which I think shows the problem:

2012-09-28 11:29:55,084 [NioProcessor-2] TRACE o.a.s.c.session.ClientSessionImpl - Received packet #5: 34 2012-09-28 11:29:55,084 [NioProcessor-2] DEBUG o.a.s.c.session.ClientSessionImpl - Received packet SSH_MSG_USERAUTH_SUCCESS 2012-09-28 11:29:55,085 [NioProcessor-2] INFO o.a.s.client.auth.UserAuthPassword - Received SSH_MSG_USERAUTH_SUCCESS 2012-09-28 11:29:55,115 [NioProcessor-13] INFO o.a.s.c.s.TcpipForwardSupport$ChannelForwardedTcpip - Send SSH_MSG_CHANNEL_OPEN on channel 0 2012-09-28 11:29:55,116 [NioProcessor-13] TRACE o.a.s.c.session.ClientSessionImpl - Sending packet #5: 5a 00 00 00 0c 64 69 72 65 63 74 2d 74 63 70 69 70 00 00 00 00 00 20 00 00 00 00 80 00 00 00 00 0d 31 39 39 2e 35 39 2e 31 33 33 2e 37 37 00 00 0d 3d 00 00 00 09 31 32 37 2e 30 2e 30 2e 31 00 00 c3 6d 2012-09-28 11:29:55,117 [NioProcessor-13] DEBUG o.a.m.f.e.OrderedThreadPoolExecutor - Adding event SESSION_OPENED to session 3
 Queue : [SESSION_OPENED, ]

2012-09-28 11:29:55,118 [pool-7-thread-1] DEBUG o.a.m.core.filterchain.IoFilterEvent - Firing a SESSION_OPENED event for session 3 2012-09-28 11:29:55,118 [NioProcessor-13] DEBUG o.a.m.f.e.OrderedThreadPoolExecutor - Adding event SESSION_CLOSED to session 3
 Queue : [SESSION_CLOSED, ]

2012-09-28 11:29:55,118 [pool-7-thread-1] DEBUG o.a.m.core.filterchain.IoFilterEvent - Event SESSION_OPENED has been fired for session 3 2012-09-28 11:29:55,119 [pool-7-thread-1] DEBUG o.a.m.core.filterchain.IoFilterEvent - Firing a SESSION_CLOSED event for session 3 2012-09-28 11:29:55,119 [pool-7-thread-1] DEBUG o.a.m.core.filterchain.IoFilterEvent - Event SESSION_CLOSED has been fired for session 3 2012-09-28 11:29:55,134 [NioProcessor-2] TRACE o.a.s.c.session.ClientSessionImpl - Received packet #6: 5b 00 00 00 00 00 00 00 00 00 20 00 00 00 00 80 00 2012-09-28 11:29:55,134 [NioProcessor-2] DEBUG o.a.s.c.session.ClientSessionImpl - Received packet SSH_MSG_CHANNEL_OPEN_CONFIRMATION 2012-09-28 11:29:55,134 [NioProcessor-2] DEBUG o.a.s.c.session.ClientSessionImpl - Received SSH_MSG_CHANNEL_OPEN_CONFIRMATION on channel 0 2012-09-28 11:29:55,134 [NioProcessor-2] DEBUG o.a.s.c.s.TcpipForwardSupport$ChannelForwardedTcpip - Closing channel 0 immediately

*** Preceisely one minute later: ***

2012-09-28 11:30:55,134 [NioProcessor-2] TRACE o.a.s.c.session.ClientSessionImpl - Received packet #105: 60 00 00 00 00 2012-09-28 11:30:55,134 [NioProcessor-2] DEBUG o.a.s.c.session.ClientSessionImpl - Received packet SSH_MSG_CHANNEL_EOF 2012-09-28 11:30:55,135 [NioProcessor-2] WARN o.a.s.c.session.ClientSessionImpl - Exception caught org.apache.sshd.common.SshException: Received SSH_MSG_CHANNEL_EOF on unknown channel 0 at org.apache.sshd.common.session.AbstractSession.getChannel(AbstractSession.java:1084) ~[sshd-core-0.9.0-SNAPSHOT.jar:0.9.0-SNAPSHOT] at org.apache.sshd.common.session.AbstractSession.channelEof(AbstractSession.java:1024) ~[sshd-core-0.9.0-SNAPSHOT.jar:0.9.0-SNAPSHOT] at org.apache.sshd.client.session.ClientSessionImpl.doHandleMessage(ClientSessionImpl.java:434) ~[sshd-core-0.9.0-SNAPSHOT.jar:0.9.0-SNAPSHOT] at org.apache.sshd.client.session.ClientSessionImpl.handleMessage(ClientSessionImpl.java:307) ~[sshd-core-0.9.0-SNAPSHOT.jar:0.9.0-SNAPSHOT] at org.apache.sshd.common.session.AbstractSession.decode(AbstractSession.java:566) ~[sshd-core-0.9.0-SNAPSHOT.jar:0.9.0-SNAPSHOT] at org.apache.sshd.common.session.AbstractSession.messageReceived(AbstractSession.java:236) ~[sshd-core-0.9.0-SNAPSHOT.jar:0.9.0-SNAPSHOT] at org.apache.sshd.common.AbstractSessionIoHandler.messageReceived(AbstractSessionIoHandler.java:58) ~[sshd-core-0.9.0-SNAPSHOT.jar:0.9.0-SNAPSHOT] at org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.messageReceived(DefaultIoFilterChain.java:716) ~[mina-core-2.0.5.jar:na] at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434) [mina-core-2.0.5.jar:na] at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46) [mina-core-2.0.5.jar:na] at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:796) [mina-core-2.0.5.jar:na] at org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:119) [mina-core-2.0.5.jar:na] at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434) [mina-core-2.0.5.jar:na] at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:426) [mina-core-2.0.5.jar:na] at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:697) [mina-core-2.0.5.jar:na] at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:651) [mina-core-2.0.5.jar:na] at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:640) [mina-core-2.0.5.jar:na] at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(AbstractPollingIoProcessor.java:67) [mina-core-2.0.5.jar:na] at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1111) [mina-core-2.0.5.jar:na] at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64) [mina-core-2.0.5.jar:na] at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.7.0_07] at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.7.0_07]
        at java.lang.Thread.run(Unknown Source) [na:1.7.0_07]
2012-09-28 11:30:55,135 [NioProcessor-2] DEBUG o.a.s.c.session.ClientSessionImpl - Closing session 2012-09-28 11:30:55,135 [NioProcessor-2] DEBUG o.a.s.c.session.ClientSessionImpl - Closing IoSession 2012-09-28 11:30:55,136 [NioProcessor-2] DEBUG o.a.s.c.session.ClientSessionImpl - IoSession closed 2012-09-28 11:30:55,136 [NioProcessor-2] INFO o.a.s.c.session.ClientSessionImpl - Session user@localhost/127.0.0.1:9022 closed

It appears that the IO Session is being closed for the test connection before the SSH_MSG_CHANNEL_OPEN_CONFIRMATION is received. Thus when the SSH_MSG_CHANNEL_OPEN_CONFIRMATION is finally received, the channel has already decided to close, and it does so without telling the server.

This might possibly happen in the PortForwardingTest case as well, but there the client/server are likely torn down before the 1 minute timeout expires that would cause the server to realize that the client channel connection is gone.

I am going to see if I can modify the client code to ensure that it does tell the server about closing the channel in this case. I'll let you know if it helps.

Kevin

Reply via email to