public override void init()
 {
     try
     {
         io = new IO();
         if (lport == -1)
         {
             Class c = Class.forName(target);
             ForwardedTCPIPDaemon daemon = (ForwardedTCPIPDaemon)c.newInstance();
             daemon.setChannel(this);
             Object[] foo = getPort(session, rport);
             daemon.setArg((Object[])foo[3]);
             new Thread(daemon).start();
             connected = true;
             return;
         }
         else
         {
             Socket socket = (factory == null) ?
                             new Socket(target, lport) :
                             factory.createSocket(target, lport);
             socket.setTcpNoDelay(true);
             io.setInputStream(socket.getInputStream());
             io.setOutputStream(socket.getOutputStream());
             connected = true;
         }
     }
     catch (Exception e)
     {
         Console.WriteLine("target={0},port={1}", target, lport);
         Console.WriteLine(e);
     }
 }
        public override void init()
        {
            try
            {
                io = new IO();
                if (lport == -1)
                {
                    ForwardedTCPIPDaemon daemon = (ForwardedTCPIPDaemon)Activator.CreateInstance(Type.GetType(target));
                    daemon.setChannel(this);
                    Object[] foo = getPort(session, rport);
                    daemon.setArg((Object[])foo[3]);
                    new System.Threading.Thread(daemon.run).Start();
                    connected = true;
                    return;
                }
                else
                {
                    Socket socket;

                    if (factory == null)
                    {
                        var ep = new IPEndPoint(Dns.GetHostEntry(target).AddressList[0], lport);
                        socket = new Socket(ep.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                        socket.Connect(ep);
                    }
                    else
                    {
                        socket = factory.createSocket(target, lport);
                    }

                    socket.NoDelay = true;

                    io.setInputStream(new NetworkStream(socket));
                    io.setOutputStream(new NetworkStream(socket));
                    connected = true;
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("target={0},port={1}", target, lport);
                Console.WriteLine(e);
            }
        }
        public override void run()
        {
            try
            {
                if (lport == -1)
                {
                    Type c = Type.GetType(target);
                    daemon = (ForwardedTCPIPDaemon)c.newInstance();

                    PipedMemoryStream Out = new PipedMemoryStream(32 * 1024);
                    /*
                    PipedOutputStream Out = new PipedOutputStream();
                    io.setInputStream(new PassiveInputStream(Out
                                                             , 32 * 1024
                                                             ), false);
                    */
                    io.setInputStream(Out);
                    daemon.setChannel(this, getInputStream(), Out);
                    object[] foo = getPort(getSession(), rport);
                    daemon.setArg((object[])foo[3]);

                    new Thread(new ThreadStart(daemon.run)).Start();
                }
                else
                {
                    socket = (factory == null) ?
                       Util.createSocket(target, lport, TIMEOUT) :
                      factory.createSocket(target, lport);
                    socket.NoDelay=true;
                    io.setInputStream(socket.GetStream());
                    io.setOutputStream(socket.GetStream());
                }
                sendOpenConfirmation();
            }
            catch //(Exception e)
            {
                sendOpenFailure(SSH_OPEN_ADMINISTRATIVELY_PROHIBITED);
                close = true;
                disconnect();
                return;
            }

            thread = Thread.CurrentThread;
            Buffer buf = new Buffer(rmpsize);
            Packet packet = new Packet(buf);
            int i = 0;
            try
            {
                while (thread != null &&
                      io != null &&
                      io.In != null)
                {
                    i = io.In.Read(buf.buffer,
                                 14,
                                 buf.buffer.Length - 14
                                 - 32 - 20 // padding and mac
                                 );
                    if (i <= 0)
                    {
                        eof();
                        break;
                    }
                    packet.reset();
                    if (close) break;
                    buf.putByte((byte)Session.SSH_MSG_CHANNEL_DATA);
                    buf.putInt(recipient);
                    buf.putInt(i);
                    buf.skip(i);
                    getSession().write(packet, this, i);
                }
            }
            catch //(Exception e)
            {
                //Console.Error.WriteLine(e);
            }
            //thread=null;
            //eof();
            disconnect();
        }
        public override void run()
        {
            try
            {
                if (lport == -1)
                {
                    Type c = Type.GetType(target);
                    daemon = (ForwardedTCPIPDaemon)c.newInstance();

                    PipedMemoryStream Out = new PipedMemoryStream(32 * 1024);

                    /*
                     * PipedOutputStream Out = new PipedOutputStream();
                     * io.setInputStream(new PassiveInputStream(Out
                     *                                       , 32 * 1024
                     *                                       ), false);
                     */
                    io.setInputStream(Out);
                    daemon.setChannel(this, getInputStream(), Out);
                    object[] foo = getPort(getSession(), rport);
                    daemon.setArg((object[])foo[3]);

                    new Thread(new ThreadStart(daemon.run)).Start();
                }
                else
                {
                    socket = (factory == null) ?
                             Util.createSocket(target, lport, TIMEOUT) :
                             factory.createSocket(target, lport);
                    socket.NoDelay = true;
                    io.setInputStream(socket.GetStream());
                    io.setOutputStream(socket.GetStream());
                }
                sendOpenConfirmation();
            }
            catch //(Exception e)
            {
                sendOpenFailure(SSH_OPEN_ADMINISTRATIVELY_PROHIBITED);
                close = true;
                disconnect();
                return;
            }

            thread = Thread.CurrentThread;
            Buffer buf    = new Buffer(rmpsize);
            Packet packet = new Packet(buf);
            int    i      = 0;

            try
            {
                while (thread != null &&
                       io != null &&
                       io.In != null)
                {
                    i = io.In.Read(buf.buffer,
                                   14,
                                   buf.buffer.Length - 14
                                   - 32 - 20 // padding and mac
                                   );
                    if (i <= 0)
                    {
                        eof();
                        break;
                    }
                    packet.reset();
                    if (close)
                    {
                        break;
                    }
                    buf.putByte((byte)Session.SSH_MSG_CHANNEL_DATA);
                    buf.putInt(recipient);
                    buf.putInt(i);
                    buf.skip(i);
                    getSession().write(packet, this, i);
                }
            }
            catch //(Exception e)
            {
                //Console.Error.WriteLine(e);
            }
            //thread=null;
            //eof();
            disconnect();
        }