• 同步模式下的端口映射程序


    今天打算写一个FtpServer玩一下的,需要看看ftp软件常用命令形式(完整实现所有ftp命令太麻烦),最开始打算通过抓包看cuteftp是如何访问ftpserver的,但要把其中的命令保存下来还得一条条复制,太麻烦,便通过proxy模式写了一个代理程序,来获取其交互的命令,写了一个简单的同步模式下的端口映射程序后,发现比常用的异步proxy要简单的多,便把这段代码贴出来,以备日后查询:

    class Program
    {
        static void Main(string[] args)
        {
            TcpListener listener = new TcpListener(new IPEndPoint(IPAddress.Loopback, 8000));
            listener.Start();
            while (true)
            {
                var client = listener.AcceptTcpClient();

                Console.WriteLine("connected");
                var proxy = new TcpClient();
                Console.WriteLine("remote connected");
                proxy.Connect(new IPEndPoint(IPAddress.Loopback, 21));

                new SyncProxy("client->remote",proxy.GetStream(), client.GetStream());
                new SyncProxy("remote->client",client.GetStream(), proxy.GetStream());
            }
        }
    }

    class SyncProxy
    {
        NetworkStream read;
        NetworkStream write;
        string name;

        public SyncProxy(string name, NetworkStream read,NetworkStream write)
        {
            this.name = name;
            this.read = read;
            this.write = write;

            System.Threading.ThreadPool.QueueUserWorkItem(PipeStream);
        }

        void PipeStream(object state)
        {
            byte[] buffer = new byte[1500];
            int count = 0;
            while (true)
            {
                try
                {
                    count = read.Read(buffer, 0, buffer.Length);
                }
                catch (Exception)
                {
                    count = 0;
                }

                if (count == 0)
                {
                    Console.WriteLine(name+" closed");
                    write.Close();
                    break;
                }

                Console.Write(name + ": "+ Encoding.Default.GetString(buffer, 0, count));
                write.Write(buffer, 0, count);
            }
        }
    }

    通过它获取到的cuteFtp交互命令如下:
    connected
    remote connected
    client->remote: 220 Serv-U FTP Server v6.0 for WinSock ready...
    remote->client: USER 1
    client->remote: 331 User name okay, need password.
    remote->client: PASS 1
    client->remote: 230 User logged in, proceed.
    remote->client: PWD
    client->remote: 257 "/" is current directory.
    remote->client: FEAT
    client->remote: 211-Extension supported
    client->remote: CLNT
    MDTM
    MDTM YYYYMMDDHHMMSS[+-TZ];filename
    SIZE
    SITE PSWD;EXEC;SET;INDEX;ZONE;CHMOD;MSG
    REST STREAM
    XCRC filename;start;end
    MODE Z
    211 End
    remote->client: REST 0
    client->remote: 350 Restarting at 0. Send STORE or RETRIEVE.
    remote->client: PASV
    client->remote: 227 Entering Passive Mode (127,0,0,1,29,18)
    remote->client: LIST
    client->remote: 150 Opening ASCII mode data connection for /bin/ls.
    client->remote: 226 Transfer complete.

  • 相关阅读:
    Tomcat,Weblogic,WebSphere,JBoss四种服务器简单对比
    最常用的动态sql语句梳理——分享给使用Mybatis的小伙伴们!
    "Invalid bound statement (not found): com.sitech.admin.dao.TbOpenAbilityInfoDao.findAbilityReadyUp"mybatis配置文件bug
    "Cannot convert value '0000-00-00' from column 2 to TIMESTAMP"mysql时间转换bug
    你一定要知道的关于Linux文件目录操作的12个常用命令
    超实用,你get了吗?再也不怕本地文件更新到环境用Linux命令重启服务器了。。。
    最长连续公共子串、最长公共子串(可以非连续)、最长回文串(连续)、最长回文串(可以不连续)、最长递增数组的求解
    显示锁(ReentranLock)
    对象的共享
    线程安全性
  • 原文地址:https://www.cnblogs.com/TianFang/p/1382734.html
Copyright © 2020-2023  润新知