Mercurial > 510Connectbot
view src/ch/ethz/ssh2/channel/LocalAcceptThread.java @ 278:d7e088fa2123 ganymed
start conversion from trilead to ganymed
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Fri, 18 Jul 2014 16:45:43 -0700 |
parents | 91a31873c42a |
children | 071eccdff8ea |
line wrap: on
line source
/* * Copyright (c) 2006-2011 Christian Plattner. All rights reserved. * Please refer to the LICENSE.txt for licensing details. */ package ch.ethz.ssh2.channel; import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; /** * LocalAcceptThread. * * @author Christian Plattner * @version 2.50, 03/15/10 */ 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 ServerSocket getServerSocket() { return ss; } @Override 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, e, 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 ignored) { } } }