今天打算写一个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.

转载于:https://www.cnblogs.com/TianFang/archive/2009/02/02/1382734.html

同步模式下的端口映射程序相关推荐

  1. 解决Carla同步模式下Runtime Error的问题(tick hangs)

    解决Carla同步模式下Runtime Error的问题(RuntimeError: time-out of 10000ms while waiting for the simulator, make ...

  2. vsftpd配置PASV模式下指定端口范围,以便配置防火墙

    什么叫做PASV mode(被动模式传送)?他是如何工作的? FTP的连接一般是有两个连接的,一个是客户程和服务器传输命令的,另一个是数据传送的连接.FTP服务程序一般会支持两种不同的模式,一种是Po ...

  3. BIO、NIO、AIO 详解和基于BIO模式下即时通信

    第一章 BIO.NIO.AIO课程介绍 身边同学写的,没发布出来,我算是转载 1.1 课程说明 ​ 在Java的软件设计开发中,通信架构是不可避免的,我们在进行不同系统或者不同进程之间的数据交互,或者 ...

  4. 为什么Fiori客户主数据的头像在异步模式下取不回来

    在同步模式下,在navigation list里切换opportunity时,总是先将account的logo设成default image: 待odata response回来之后,将图片的url传 ...

  5. MySQL 迁移到半同步模式

    下面实验是基于http://5073392.blog.51cto.com/5063392/1536487搭建的 1) 在master上安装插件 mysql> install plugin rpl ...

  6. Carla设置同步模式

    1. 目的 默认情况下,Carla运行在异步模式下.服务器与客户端以各自的速度运行.当客户端请求到来时,服务器相应请求,处理结束之后继续运行,并不等待客户端处理完成服务器返回的数据. 存在的问题是,当 ...

  7. 异步模式下的 Vhost Packed Ring 设计介绍

    引言 随着计算机硬件资源整合的发展,虚拟化的研究与应用日新月异.Virtio/Vhost作为一种设备虚拟化的典型应用,在业界受到了广泛的关注.Virtio 最开始由Rusty Russell在其200 ...

  8. 用户模式下的线程同步

    在以下两种基本情况下,线程之间需要相互通信 1.需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性 2.一个线程需要通知其他线程某项任务已经完成. 原子访问相关的内容就直接略过了,因为感觉实 ...

  9. Linux下同步模式、异步模式、阻塞调用、非阻塞调用总结

    同步和异步:与消息的通知机制有关. 本质区别 现实例子 同步模式 由处理消息者自己去等待消息是否被触发 我去银行办理业务,选择排队等,排到头了就办理. 异步模式 由触发机制来通知处理消息者 我去银行办 ...

最新文章

  1. iPhoneX延迟这么久预订,真实原因连库克也没料到
  2. 在MFC中创建动态控件的生成与响应
  3. python新手遇到的5大坑
  4. Android如何把 内容复制到剪贴板
  5. exists的用法 python_5 年 Python ,总结的 10 条 Python 使用技巧
  6. android linearlayout 方法,android布局----LinearLayout布局方式
  7. 约瑟夫环 java_约瑟夫环Java实现
  8. 与詹金斯一起连续交付Heroku
  9. mysql编译安装root密码_MySQL 5.7.11编译安装以及修改root密码小结
  10. 命令行调用dubbo服务
  11. mysql join 组合索引,图文详解MySQL中两表关联的连接表如何创建索引
  12. 近似推断:使用高斯混合模型
  13. 简单的三层框架以及使用dbutils进行数据库操作(入门)
  14. CSS布局大全-案例
  15. 好程序员分享大数据入门教程:Hadoop和spark的性能比较
  16. 上汽通用凯迪拉克汽车的多媒体系统不能识别u盘的解决方法
  17. 2021-09-07体脂秤模块用来做什么?开发八电极体脂秤方案
  18. 调用函数printchs输出星号图
  19. 车载以太网100base-T1
  20. 12306验证码识别初尝试(2)-百度通用文字识别-成功率约75%

热门文章

  1. html中判断字段第一位,javascript判断字符串是否相等
  2. 每天一道LeetCode-----链表插入排序
  3. 1033 旧键盘打字 (20 分)(c语言)
  4. 三数之和—leetcode15
  5. svn的安装和服务器搭建, 汉化以及多项目管理
  6. 判断多边形边界曲线顺/逆时针
  7. 一个进程可以创建多少线程?
  8. python 之 click 包,设置命令行参数
  9. [精选代码笔记]Anagram, group-anagrams, two sum
  10. I/O复用函数的使用——select