| |
| package com.trilead.ssh2.channel; |
| |
| import java.io.IOException; |
| import java.net.InetSocketAddress; |
| import java.net.ServerSocket; |
| import java.net.Socket; |
| |
| /** |
| * LocalAcceptThread. |
| * |
| * @author Christian Plattner, plattner@trilead.com |
| * @version $Id: LocalAcceptThread.java,v 1.1 2007/10/15 12:49:56 cplattne Exp $ |
| */ |
| public class LocalAcceptThread extends Thread implements IChannelWorkerThread |
| { |
| ChannelManager cm; |
| String host_to_connect; |
| int port_to_connect; |
| |
| final ServerSocket ss; |
| |
| public LocalAcceptThread(ChannelManager cm, int local_port, String host_to_connect, int port_to_connect) |
| throws IOException |
| { |
| this.cm = cm; |
| this.host_to_connect = host_to_connect; |
| this.port_to_connect = port_to_connect; |
| |
| ss = new ServerSocket(local_port); |
| } |
| |
| public LocalAcceptThread(ChannelManager cm, InetSocketAddress localAddress, String host_to_connect, |
| int port_to_connect) throws IOException |
| { |
| this.cm = cm; |
| this.host_to_connect = host_to_connect; |
| this.port_to_connect = port_to_connect; |
| |
| ss = new ServerSocket(); |
| ss.bind(localAddress); |
| } |
| |
| public void run() |
| { |
| try |
| { |
| cm.registerThread(this); |
| } |
| catch (IOException e) |
| { |
| stopWorking(); |
| return; |
| } |
| |
| while (true) |
| { |
| Socket s = null; |
| |
| try |
| { |
| s = ss.accept(); |
| } |
| catch (IOException e) |
| { |
| stopWorking(); |
| return; |
| } |
| |
| Channel cn = null; |
| StreamForwarder r2l = null; |
| StreamForwarder l2r = null; |
| |
| try |
| { |
| /* This may fail, e.g., if the remote port is closed (in optimistic terms: not open yet) */ |
| |
| cn = cm.openDirectTCPIPChannel(host_to_connect, port_to_connect, s.getInetAddress().getHostAddress(), s |
| .getPort()); |
| |
| } |
| catch (IOException e) |
| { |
| /* Simply close the local socket and wait for the next incoming connection */ |
| |
| try |
| { |
| s.close(); |
| } |
| catch (IOException ignore) |
| { |
| } |
| |
| continue; |
| } |
| |
| try |
| { |
| r2l = new StreamForwarder(cn, null, null, cn.stdoutStream, s.getOutputStream(), "RemoteToLocal"); |
| l2r = new StreamForwarder(cn, r2l, s, s.getInputStream(), cn.stdinStream, "LocalToRemote"); |
| } |
| catch (IOException e) |
| { |
| try |
| { |
| /* This message is only visible during debugging, since we discard the channel immediatelly */ |
| cn.cm.closeChannel(cn, "Weird error during creation of StreamForwarder (" + e.getMessage() + ")", |
| true); |
| } |
| catch (IOException ignore) |
| { |
| } |
| |
| continue; |
| } |
| |
| r2l.setDaemon(true); |
| l2r.setDaemon(true); |
| r2l.start(); |
| l2r.start(); |
| } |
| } |
| |
| public void stopWorking() |
| { |
| try |
| { |
| /* This will lead to an IOException in the ss.accept() call */ |
| ss.close(); |
| } |
| catch (IOException e) |
| { |
| } |
| } |
| } |