Exemplo n.º 1
0
 void Pipe()
 {
     _sockTcp = SockServer.CreateConnection(_kernel, _ip, _listenPort, null, this);
     if (_sockTcp != null)
     {
         while (_life)
         {
             var len = _sockTcp.Length();
             if (len > 0)
             {
                 const int tout = 3; //受信バイト数がわかっているので、ここでのタイムアウト値はあまり意味が無い
                 var       b    = _sockTcp.Recv(len, tout, this);
                 if (b != null)
                 {
                     _buffer = Bytes.Create(_buffer, b);
                 }
             }
             if (_sockTcp.Length() == 0 && _sockTcp.SockState != SockState.Connect)
             {
                 break;
             }
         }
         _sockTcp.Close();
     }
     IsRecv = false;
 }
Exemplo n.º 2
0
        public void STOR_DELEマンド_V6()
        {
            var cl = _v6Cl;

            //共通処理(ログイン成功)
            Login("user1", cl);

            //port
            var port = 249;

            cl.StringSend("PORT 127,0,0,1,0,249");
            var dl = SockServer.CreateConnection(new Kernel(), new Ip(IpKind.V4Localhost), port, null, this);

            Assert.That(cl.StringRecv(1, this), Is.EqualTo("200 PORT command successful.\r\n"));

            //stor
            cl.StringSend("STOR 0.txt");
            Assert.That(cl.StringRecv(1, this), Is.EqualTo("150 Opening ASCII mode data connection for 0.txt.\r\n"));

            dl.Send(new byte[3]);
            dl.Close();

            Assert.That(cl.StringRecv(1, this), Is.EqualTo("226 Transfer complete.\r\n"));

            //dele
            cl.StringSend("DELE 0.txt");
            Assert.That(cl.StringRecv(1, this), Is.EqualTo("250 Dele command successful.\r\n"));
        }
Exemplo n.º 3
0
        public void LISTコマンド_V6()
        {
            var cl = _v6Cl;

            //共通処理(ログイン成功)
            Login("user1", cl);

            //port
            var port = 251;

            cl.StringSend("PORT 127,0,0,1,0,251");
            var dl = SockServer.CreateConnection(new Kernel(), new Ip(IpKind.V4Localhost), port, null, this);

            Assert.That(cl.StringRecv(1, this), Is.EqualTo("200 PORT command successful.\r\n"));

            //list
            cl.StringSend("LIST -la");
            Assert.That(cl.StringRecv(1, this), Is.EqualTo("150 Opening ASCII mode data connection for ls.\r\n"));

            Assert.That(listMask(dl.StringRecv(3, this)), Is.EqualTo("drwxrwxrwx 1 nobody nogroup nnnn mon dd hh:mm home0\r\n"));
            Assert.That(listMask(dl.StringRecv(3, this)), Is.EqualTo("drwxrwxrwx 1 nobody nogroup nnnn mon dd hh:mm home1\r\n"));
            Assert.That(listMask(dl.StringRecv(3, this)), Is.EqualTo("drwxrwxrwx 1 nobody nogroup nnnn mon dd hh:mm home2\r\n"));
            Assert.That(listMask(dl.StringRecv(3, this)), Is.EqualTo("-rwxrwxrwx 1 nobody nogroup nnnn mon dd hh:mm 1.txt\r\n"));
            Assert.That(listMask(dl.StringRecv(3, this)), Is.EqualTo("-rwxrwxrwx 1 nobody nogroup nnnn mon dd hh:mm 2.txt\r\n"));
            Assert.That(listMask(dl.StringRecv(3, this)), Is.EqualTo("-rwxrwxrwx 1 nobody nogroup nnnn mon dd hh:mm 3.txt\r\n"));

            dl.Close();
        }
Exemplo n.º 4
0
        private bool JobPasv(Session session, FtpCmd ftpCmd)
        {
            var port = session.Port;
            var ip   = session.SockCtrl.LocalIp;

            // �f�[�^�X�g���[���̃\�P�b�g�̍쐬
            for (int i = 0; i < 100; i++)
            {
                port++;
                if (port >= 9999)
                {
                    port = 2000;
                }
                //�o�C���h�”\���ǂ����̊m�F
                if (SockServer.IsAvailable(Kernel, ip, port))
                {
                    //����
                    if (ftpCmd == FtpCmd.Epsv)
                    {
                        //Java fix Ver5.8.3
                        //session.StringSend(string.Format("229 Entering Extended Passive Mode. (|||{0}|)", port));
                        session.StringSend(string.Format("229 Entering Extended Passive Mode (|||{0}|)", port));
                    }
                    else
                    {
                        var ipStr = ip.ToString();
                        //Java fix Ver5.8.3
                        //session.StringSend(string.Format("227 Entering Passive Mode. ({0},{1},{2})", ipStr.Replace('.',','), port/256, port%256));
                        session.StringSend(string.Format("227 Entering Passive Mode ({0},{1},{2})", ipStr.Replace('.', ','), port / 256, port % 256));
                    }
                    //�w�肵���A�h���X�E�|�[�g�ő҂��󂯂�
                    var sockData = SockServer.CreateConnection(Kernel, ip, port, null, this);
                    if (sockData == null)
                    {
                        //�ڑ����s
                        return(false);
                    }
                    if (sockData.SockState != Bjd.sock.SockState.Error)
                    {
                        //�Z�b�V�������̕ۑ�
                        session.Port     = port;
                        session.SockData = sockData;
                        return(true);
                    }
                }
            }
            session.StringSend("500 command not understood:");
            return(true);
        }
Exemplo n.º 5
0
        private bool JobPasv(Session session, FtpCmd ftpCmd)
        {
            var port = session.Port;
            var ip   = session.SockCtrl.LocalIp;

            // データストリームのソケットの作成
            for (int i = 0; i < 100; i++)
            {
                port++;
                if (port >= 9999)
                {
                    port = 2000;
                }
                //バインド可能かどうかの確認
                if (SockServer.IsAvailable(Kernel, ip, port))
                {
                    //成功
                    if (ftpCmd == FtpCmd.Epsv)
                    {
                        //Java fix Ver5.8.3
                        //session.StringSend(string.Format("229 Entering Extended Passive Mode. (|||{0}|)", port));
                        session.StringSend(string.Format("229 Entering Extended Passive Mode (|||{0}|)", port));
                    }
                    else
                    {
                        var ipStr = ip.ToString();
                        //Java fix Ver5.8.3
                        //session.StringSend(string.Format("227 Entering Passive Mode. ({0},{1},{2})", ipStr.Replace('.',','), port/256, port%256));
                        session.StringSend(string.Format("227 Entering Passive Mode ({0},{1},{2})", ipStr.Replace('.', ','), port / 256, port % 256));
                    }
                    //指定したアドレス・ポートで待ち受ける
                    var sockData = SockServer.CreateConnection(Kernel, ip, port, null, this);
                    if (sockData == null)
                    {
                        //接続失敗
                        return(false);
                    }
                    if (sockData.SockState != Bjd.sock.SockState.Error)
                    {
                        //セッション情報の保存
                        session.Port     = port;
                        session.SockData = sockData;
                        return(true);
                    }
                }
            }
            session.StringSend("500 command not understood:");
            return(true);
        }
Exemplo n.º 6
0
        public new void Stop()
        {
            if (_sockServer == null)
            {
                return;  //すでに終了処理が終わっている
            }
            base.Stop(); //life=false すべてのループを解除する
            _sockServer.Close();

            // 全部の子スレッドが終了するのを待つ
            while (Count() > 0)
            {
                Thread.Sleep(500);
            }
            _sockServer = null;
        }
Exemplo n.º 7
0
        public new void Stop()
        {
            if (_sockServer == null)
            {
                return;  //���łɏI���������I����Ă���
            }
            base.Stop(); //life=false �ł��ׂẴ��[�v��������
            _sockServer.Close();

            // �S���̎q�X���b�h���I������̂�҂�
            while (Count() > 0)
            {
                Thread.Sleep(500);
            }
            _sockServer = null;
        }
Exemplo n.º 8
0
        public void PORTコマンド()
        {
            var cl = _v4Cl;

            //共通処理(ログイン成功)
            Login("user1", cl);

            int port = 256; //テストの連続のためにPORTコマンドのテストとはポート番号をずらす必要がある

            cl.StringSend("PORT 127,0,0,1,0,256");
            SockTcp dl = SockServer.CreateConnection(new Kernel(), new Ip(IpKind.V4Localhost), port, null, this);

            Assert.That(cl.StringRecv(1, this), Is.EqualTo("200 PORT command successful.\r\n"));

            dl.Close();
        }
Exemplo n.º 9
0
        public void EPRTコマンド()
        {
            var cl = _v6Cl;

            //共通処理(ログイン成功)
            Login("user1", cl);

            var port = 252; //テストの連続のためにPORTコマンドのテストとはポート番号をずらす必要がある

            cl.StringSend("EPRT |2|::1|252|");
            var dl = SockServer.CreateConnection(new Kernel(), new Ip(IpKind.V6Localhost), port, null, this);

            Assert.That(cl.StringRecv(1, this), Is.EqualTo("200 EPRT command successful.\r\n"));

            dl.Close();
        }
Exemplo n.º 10
0
            public void getLocalAddress(String title, ProtocolKind protocolKind)
            {
                var       bindIp    = new Ip(IpKind.V4Localhost);
                const int port      = 9991;
                const int listenMax = 10;
                Ssl       ssl       = null;

                var sockServer = new SockServer(new Kernel(), protocolKind, ssl);

                ThreadStart action = () => {
                    if (protocolKind == ProtocolKind.Tcp)
                    {
                        sockServer.Bind(bindIp, port, listenMax);
                    }
                    else
                    {
                        sockServer.Bind(bindIp, port);
                    }
                };


                var _t = new Thread(action)
                {
                    IsBackground = true
                };

                _t.Start();

                while (sockServer.SockState == SockState.Idle)
                {
                    Thread.Sleep(200);
                }

                var localAddress = sockServer.LocalAddress;

                Assert.That(localAddress.ToString(), Is.EqualTo("127.0.0.1:9991"));
                //bind()後 localAddressの取得が可能になる

                var remoteAddress = sockServer.RemoteAddress;

                Assert.IsNull(remoteAddress);
                //SockServerでは、remoteAddressは常にnullになる

                sockServer.Close();
            }
Exemplo n.º 11
0
        protected override void OnRunThread()
        {
            ThreadBaseKind = ThreadBaseKind.Running;

            int timeout = 3;

            _sock[CS.Client] = new SockTcp(_kernel, _connectIp, _connectPort, timeout, null);
            _sock[CS.Server] = SockServer.CreateConnection(_kernel, _listenIp, _listenPort, null, this);

            while (IsLife())
            {
                for (var i = 0; i < 2; i++)
                {
                    var cs = (i == 0) ? CS.Server : CS.Client;
                    if (_buf[cs].Length == 0)
                    {
                        var len = _sock[cs].Length();
                        if (len != 0)
                        {
                            _tunnel.ResetIdle();//アイドル時間の更新

                            _buf[cs] = _sock[cs].Recv(len, 1, this);
                        }
                    }
                    if (_buf[cs].Length != 0)
                    {
                        var s = _sock[((i == 0) ? CS.Client : CS.Server)].Send(_buf[cs]);
                        if (-1 != s)
                        {
                            _buf[cs] = new byte[0];
                        }
                    }
                }
                if (_sock[CS.Server].SockState != SockState.Connect && _sock[CS.Server].Length() == 0)
                {
                    break;
                }
                if (_sock[CS.Client].SockState != SockState.Connect && _sock[CS.Client].Length() == 0)
                {
                    break;
                }
            }
            _sock[CS.Client].Close();
            _sock[CS.Server].Close();
        }
Exemplo n.º 12
0
        public void DOWNユーザはSTORに失敗する_V6()
        {
            var cl = _v6Cl;

            //共通処理(ログイン成功)
            Login("user3", cl);

            //port
            var port = 249;

            cl.StringSend("PORT 127,0,0,1,0,249");
            var dl = SockServer.CreateConnection(new Kernel(), new Ip(IpKind.V4Localhost), port, null, this);

            Assert.That(cl.StringRecv(1, this), Is.EqualTo("200 PORT command successful.\r\n"));

            //stor
            cl.StringSend("STOR 0.txt");
            Assert.That(cl.StringRecv(1, this), Is.EqualTo("550 Permission denied.\r\n"));
        }
Exemplo n.º 13
0
        protected override void OnRunThread()
        {
            var port    = (int)Conf.Get("port");
            var bindStr = string.Format("{0}:{1} {2}", _oneBind.Addr, port, _oneBind.Protocol);

            Logger.Set(LogKind.Normal, null, 9000000, bindStr);

            //DOSを受けた場合、multiple数まで連続アクセスまでは記憶してしまう
            //DOSが終わった後も、その分だけ復帰に時間を要する


            //Ver5.9,2 Java fix
            //_sockServer = new SockServer(this.Kernel,_oneBind.Protocol);
            _sockServer = new SockServer(Kernel, _oneBind.Protocol, ssl);

            //Ver5.9.2 Java fix
            if (ssl != null && !ssl.Status)
            {
                Logger.Set(LogKind.Error, null, 9000024, bindStr);
                //[C#]
                ThreadBaseKind = ThreadBaseKind.Running;
            }
            else
            {
                if (_sockServer.SockState != sock.SockState.Error)
                {
                    if (_sockServer.ProtocolKind == ProtocolKind.Tcp)
                    {
                        RunTcpServer(port);
                    }
                    else
                    {
                        RunUdpServer(port);
                    }
                }
            }

            //Java fix
            _sockServer.Close();
            Logger.Set(LogKind.Normal, null, 9000001, bindStr);
        }
Exemplo n.º 14
0
        protected override void OnRunThread()
        {
            var port    = (int)Conf.Get("port");
            var bindStr = string.Format("{0}:{1} {2}", _oneBind.Addr, port, _oneBind.Protocol);

            Logger.Set(LogKind.Normal, null, 9000000, bindStr);

            //DOS��󂯂��ꍇ�Amultiple���܂ŘA���A�N�Z�X�܂ł͋L�����Ă��܂�
            //DOS���I��������A���̕��������A�Ɏ��Ԃ�v����

            //Ver5.9,2 Java fix
            //_sockServer = new SockServer(this.Kernel,_oneBind.Protocol);
            _sockServer = new SockServer(Kernel, _oneBind.Protocol, ssl);

            //Ver5.9.2 Java fix
            if (ssl != null && !ssl.Status)
            {
                Logger.Set(LogKind.Error, null, 9000024, bindStr);
                //[C#]
                ThreadBaseKind = ThreadBaseKind.Running;
            }
            else
            {
                if (_sockServer.SockState != sock.SockState.Error)
                {
                    if (_sockServer.ProtocolKind == ProtocolKind.Tcp)
                    {
                        RunTcpServer(port);
                    }
                    else
                    {
                        RunUdpServer(port);
                    }
                }
            }

            //Java fix
            _sockServer.Close();
            Logger.Set(LogKind.Normal, null, 9000001, bindStr);
        }
Exemplo n.º 15
0
            public void startStop(String title, ProtocolKind protocolKind)
            {
                var       bindIp    = new Ip(IpKind.V4Localhost);
                const int port      = 8881;
                const int listenMax = 10;
                Ssl       ssl       = null;

                var sockServer = new SockServer(new Kernel(), protocolKind, ssl);

                Assert.That(sockServer.SockState, Is.EqualTo(SockState.Idle));

                ThreadStart action = () => {
                    if (protocolKind == ProtocolKind.Tcp)
                    {
                        sockServer.Bind(bindIp, port, listenMax);
                    }
                    else
                    {
                        sockServer.Bind(bindIp, port);
                    }
                };

                var _t = new Thread(action)
                {
                    IsBackground = true
                };

                _t.Start();


                while (sockServer.SockState == SockState.Idle)
                {
                    Thread.Sleep(100);
                }
                Assert.That(sockServer.SockState, Is.EqualTo(SockState.Bind));
                sockServer.Close(); //bind()にThreadBaseのポインタを送っていないため、isLifeでブレイクできないので、selectで例外を発生させて終了する
                Assert.That(sockServer.SockState, Is.EqualTo(SockState.Error));
            }
Exemplo n.º 16
0
        public void UPユーザはRETRに失敗する_V6()
        {
            var cl = _v6Cl;

            //共通処理(ログイン成功)
            Login("user2", cl);

            //port
            var port = 250;

            cl.StringSend("PORT 127,0,0,1,0,250");
            var dl = SockServer.CreateConnection(new Kernel(), new Ip(IpKind.V4Localhost), port, null, this);

            Assert.That(cl.StringRecv(1, this), Is.EqualTo("200 PORT command successful.\r\n"));

            //retr
            cl.StringSend("RETR 3.txt");
            Assert.That(cl.StringRecv(1, this), Is.EqualTo("550 Permission denied.\r\n"));
            //		Thread.Sleep(10);
            //		Assert.That(dl.Length, Is.EqualTo(24));

            dl.Close();
        }
Exemplo n.º 17
0
        public void RETRコマンド_V6()
        {
            var cl = _v6Cl;

            //共通処理(ログイン成功)
            Login("user1", cl);

            //port
            var port = 250;

            cl.StringSend("PORT 127,0,0,1,0,250");
            var dl = SockServer.CreateConnection(new Kernel(), new Ip(IpKind.V4Localhost), port, null, this);

            Assert.That(cl.StringRecv(1, this), Is.EqualTo("200 PORT command successful.\r\n"));

            //retr
            cl.StringSend("RETR 3.txt");
            Assert.That(cl.StringRecv(1, this), Is.EqualTo("150 Opening ASCII mode data connection for 3.txt (24 bytes).\r\n"));
            Thread.Sleep(10);
            Assert.That(dl.Length(), Is.EqualTo(24));

            dl.Close();
        }
Exemplo n.º 18
0
        //サーバ側若しくはクライアント側どちらかのSockTcpは、Listen状態で生成が終わっている
        //そして、その接続の待ち受け開始は、このクラスの中で行われる
        //接続が完了した後、反対側のサーバ(Ip,port)へ、コネクトする

        public DataThread(Kernel kernel, Logger logger, int clientPort, int serverPort, Ip bindAddr, Ip ip, int port, int timeout)
        {
            _kernel = kernel;
            _logger = logger;

            _timeout = timeout;

            _ip   = ip;
            _port = port;

            _sock[CS.Client] = null;
            _sock[CS.Server] = null;

            if (serverPort != 0)   //サーバ側がListen状態の場合 PASV
            {
                _sock[CS.Server] = SockServer.CreateConnection(kernel, bindAddr, serverPort, null, this);
                if (_sock[CS.Server] == null)
                {
                    return;
                }
            }
            else if (clientPort != 0)     //クライアント側がListen状態の場合 PORT
            {
                _sock[CS.Client] = SockServer.CreateConnection(kernel, bindAddr, clientPort, null, this);
                if (_sock[CS.Client] == null)
                {
                    return;
                }
            }
            //パイプスレッドの生成
            _t = new Thread(Pipe)
            {
                IsBackground = true
            };
            _t.Start();
        }
Exemplo n.º 19
0
        //protected override byte[] AssumptionLine(byte[] buf,ILife iLife) {
        byte[] AssumptionLine(byte[] buf, ILife iLife)
        {
            //stringに変換してから処理する
            var str = Encoding.ASCII.GetString(buf);

            Logger.Set(LogKind.Detail, null, 7, str);

            var index = str.IndexOf(" ");

            if (index < 0)
            {
                goto end;
            }

            var cmdStr   = str.Substring(0, index);
            var paramStr = str.Substring(index + 1);

            if (cmdStr == "227")
            {
                //PASVに対するレスポンス

                //**********************************************************************
                // 「PASV 192.168.22.102,23,15」コマンドからサーバ側の情報を取得する
                //**********************************************************************
                var tmp2 = paramStr.Split('(', ')');
                if (tmp2.Length != 3)
                {
                    Logger.Set(LogKind.Error, null, 5, str);
                    goto end;
                }
                string[] tmp = tmp2[1].Split(',');
                if (tmp.Length != 6)
                {
                    Logger.Set(LogKind.Error, null, 6, str);
                    goto end;
                }
                var connectIp   = new Ip(string.Format("{0}.{1}.{2}.{3}", tmp[0], tmp[1], tmp[2], tmp[3]));
                var connectPort = Convert.ToInt32(tmp[4]) * 256 + Convert.ToInt32(tmp[5]);

                //**********************************************************************
                // クライアント側用のListenソケットを生成する
                //**********************************************************************
                var listenIp = Sock[CS.Client].LocalIp;
                // 利用可能なデータポートの選定
                int listenPort = 0;
                while (iLife.IsLife())
                {
                    _dataPort++;
                    if (SockServer.IsAvailable(_kernel, listenIp, _dataPort))
                    {
                        listenPort = _dataPort;
                        break;
                    }
                }

                //**********************************************************************
                // クライアント側に送る227レスポンスを生成する
                //**********************************************************************
                str = string.Format("227 Entering Passive Mode ({0},{1},{2},{3},{4},{5})\r\n", listenIp.IpV4[0], listenIp.IpV4[1], listenIp.IpV4[2], listenIp.IpV4[3], listenPort / 256, listenPort % 256);
                buf = Encoding.ASCII.GetBytes(str);

                //データスレッドの準備
                if (_dataTunnel != null)
                {
                    _dataTunnel.Dispose();
                }
                _dataTunnel = new DataTunnel(_kernel, Logger, listenIp, listenPort, connectIp, connectPort, this);
                _dataTunnel.Start();
                Thread.Sleep(3);      //Listenが完了してから 227を送信する
            }
            else if (cmdStr == "226") //Transfer complete.
            //_dataTunnel.WaitComplate();
            //Thread.Sleep(10);
            //_dataTunnel.Stop();
            {
            }
            else if (cmdStr.ToUpper() == "PORT")
            {
                //**********************************************************************
                //「PORT 192.168.22.102,23,15」コマンドからクライアント側の情報を取得する
                //**********************************************************************
                var tmp = paramStr.Split(',');
                if (tmp.Length != 6)
                {
                    Logger.Set(LogKind.Error, null, 4, str);
                    goto end;
                }
                var connectIp   = new Ip(string.Format("{0}.{1}.{2}.{3}", tmp[0], tmp[1], tmp[2], tmp[3]));
                var connectPort = Convert.ToInt32(tmp[4]) * 256 + Convert.ToInt32(tmp[5]);

                //**********************************************************************
                // サーバ側用のListenソケットを生成する
                //**********************************************************************
                var listenIp = Sock[CS.Server].LocalIp;
                // 利用可能なデータポートの選定
                int listenPort = 0;
                while (iLife.IsLife())
                {
                    _dataPort++;
                    if (SockServer.IsAvailable(_kernel, listenIp, _dataPort))
                    {
                        listenPort = _dataPort;
                        break;
                    }
                }
                //**********************************************************************
                // サーバ側に送るPORTコマンドを生成する
                //**********************************************************************
                //置き換えたPORTコマンドをセットする
                str = string.Format("PORT {0},{1},{2},{3},{4},{5}\r\n", listenIp.IpV4[0], listenIp.IpV4[1], listenIp.IpV4[2], listenIp.IpV4[3], listenPort / 256, listenPort % 256);
                buf = Encoding.ASCII.GetBytes(str);

                //データスレッドの準備
                if (_dataTunnel != null)
                {
                    _dataTunnel.Dispose();
                }
                _dataTunnel = new DataTunnel(_kernel, Logger, listenIp, listenPort, connectIp, connectPort, this);
                _dataTunnel.Start();
                Thread.Sleep(3); //Listenが完了してから PORTを送信する
            }
end:
            return(buf);
        }
Exemplo n.º 20
0
 public EchoServer(String addr, int port) : base(null)
 {
     _sockServer = new SockServer(new Kernel(), ProtocolKind.Udp, _ssl);
     _addr       = addr;
     _port       = port;
 }
Exemplo n.º 21
0
        //プロキシ処理
        override public bool Pipe(ILife iLife)
        {
            DataThread dataThread = null;
            var        paramStr   = "";

            //サーバ側との接続処理
            if (!Proxy.Connect(iLife, _oneObj.Request.HostName, _oneObj.Request.Port, _oneObj.Request.RequestStr, _oneObj.Request.Protocol))
            {
                Proxy.Logger.Set(LogKind.Debug, null, 999, "□Break proxy.Connect()==false");
                return(false);
            }


            //wait 220 welcome
            if (!WaitLine("220", ref paramStr, iLife))
            {
                return(false);
            }

            Proxy.Sock(CS.Server).AsciiSend(string.Format("USER {0}", _user));
            if (!WaitLine("331", ref paramStr, iLife))
            {
                return(false);
            }

            Proxy.Sock(CS.Server).AsciiSend(string.Format("PASS {0}", _pass));
            if (!WaitLine("230", ref paramStr, iLife))
            {
                return(false);
            }

            //Ver5.6.6
            if (_path == "/")
            {
                Proxy.Sock(CS.Server).AsciiSend("PWD");
                if (!WaitLine("257", ref paramStr, iLife))
                {
                    return(false);
                }
                var tmp = paramStr.Split(' ');
                if (tmp.Length >= 1)
                {
                    _path = tmp[0].Trim(new[] { '"' });
                    if (_path[_path.Length - 1] != '/')
                    {
                        _path = _path + "/";
                    }
                }
            }


            //リクエスト
            if (_path != "")
            {
                Proxy.Sock(CS.Server).AsciiSend(string.Format("CWD {0}", _path));
                if (!WaitLine("250", ref paramStr, iLife))
                {
                    goto end;
                }
            }

            Proxy.Sock(CS.Server).AsciiSend(_file == "" ? "TYPE A" : "TYPE I");
            if (!WaitLine("200", ref paramStr, iLife))
            {
                goto end;
            }

            //PORTコマンド送信
            var bindAddr = Proxy.Sock(CS.Server).LocalIp;

            // 利用可能なデータポートの選定
            while (iLife.IsLife())
            {
                DataPort++;
                if (DataPort >= 9999)
                {
                    DataPort = 2000;
                }
                if (SockServer.IsAvailable(_kernel, bindAddr, DataPort))
                {
                    break;
                }
            }
            int listenPort = DataPort;

            //データスレッドの生成
            dataThread = new DataThread(_kernel, bindAddr, listenPort);

            // サーバ側に送るPORTコマンドを生成する
            string str = string.Format("PORT {0},{1},{2},{3},{4},{5}", bindAddr.IpV4[0], bindAddr.IpV4[1], bindAddr.IpV4[2], bindAddr.IpV4[3], listenPort / 256, listenPort % 256);



            Proxy.Sock(CS.Server).AsciiSend(str);
            if (!WaitLine("200", ref paramStr, iLife))
            {
                goto end;
            }

            if (_file == "")
            {
                Proxy.Sock(CS.Server).AsciiSend("LIST");
                if (!WaitLine("150", ref paramStr, iLife))
                {
                    goto end;
                }
            }
            else
            {
                Proxy.Sock(CS.Server).AsciiSend("RETR " + _file);
                if (!WaitLine("150", ref paramStr, iLife))
                {
                    goto end;
                }
            }

            //Ver5.0.2
            while (iLife.IsLife())
            {
                if (!dataThread.IsRecv)
                {
                    break;
                }
            }

            if (!WaitLine("226", ref paramStr, iLife))
            {
                goto end;
            }

            byte[] doc;
            if (_file == "")
            {
                //受信結果をデータスレッドから取得する
                List <string> lines = Inet.GetLines(dataThread.ToString());
                //FTPサーバから取得したLISTの情報をHTMLにコンバートする
                doc = ConvFtpList(lines, _path);
            }
            else
            {
                doc = dataThread.ToBytes();
            }

            //クライアントへリプライ及びヘッダを送信する
            var header = new Header();

            header.Replace("Server", Util.SwapStr("$v", _kernel.Ver.Version(), (string)_conf.Get("serverHeader")));

            header.Replace("MIME-Version", "1.0");

            if (_file == "")
            {
                header.Replace("Date", Util.UtcTime2Str(DateTime.UtcNow));
                header.Replace("Content-Type", "text/html");
            }
            else
            {
                header.Replace("Content-Type", "none/none");
            }
            header.Replace("Content-Length", doc.Length.ToString());

            Proxy.Sock(CS.Client).AsciiSend("HTTP/1.0 200 OK");     //リプライ送信
            Proxy.Sock(CS.Client).SendUseEncode(header.GetBytes()); //ヘッダ送信
            Proxy.Sock(CS.Client).SendNoEncode(doc);                //ボディ送信
end:
            if (dataThread != null)
            {
                dataThread.Dispose();
            }

            return(false);
        }