同步模式下的端口映射程序
今天打算写一个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
同步模式下的端口映射程序相关推荐
- 解决Carla同步模式下Runtime Error的问题(tick hangs)
解决Carla同步模式下Runtime Error的问题(RuntimeError: time-out of 10000ms while waiting for the simulator, make ...
- vsftpd配置PASV模式下指定端口范围,以便配置防火墙
什么叫做PASV mode(被动模式传送)?他是如何工作的? FTP的连接一般是有两个连接的,一个是客户程和服务器传输命令的,另一个是数据传送的连接.FTP服务程序一般会支持两种不同的模式,一种是Po ...
- BIO、NIO、AIO 详解和基于BIO模式下即时通信
第一章 BIO.NIO.AIO课程介绍 身边同学写的,没发布出来,我算是转载 1.1 课程说明 在Java的软件设计开发中,通信架构是不可避免的,我们在进行不同系统或者不同进程之间的数据交互,或者 ...
- 为什么Fiori客户主数据的头像在异步模式下取不回来
在同步模式下,在navigation list里切换opportunity时,总是先将account的logo设成default image: 待odata response回来之后,将图片的url传 ...
- MySQL 迁移到半同步模式
下面实验是基于http://5073392.blog.51cto.com/5063392/1536487搭建的 1) 在master上安装插件 mysql> install plugin rpl ...
- Carla设置同步模式
1. 目的 默认情况下,Carla运行在异步模式下.服务器与客户端以各自的速度运行.当客户端请求到来时,服务器相应请求,处理结束之后继续运行,并不等待客户端处理完成服务器返回的数据. 存在的问题是,当 ...
- 异步模式下的 Vhost Packed Ring 设计介绍
引言 随着计算机硬件资源整合的发展,虚拟化的研究与应用日新月异.Virtio/Vhost作为一种设备虚拟化的典型应用,在业界受到了广泛的关注.Virtio 最开始由Rusty Russell在其200 ...
- 用户模式下的线程同步
在以下两种基本情况下,线程之间需要相互通信 1.需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性 2.一个线程需要通知其他线程某项任务已经完成. 原子访问相关的内容就直接略过了,因为感觉实 ...
- Linux下同步模式、异步模式、阻塞调用、非阻塞调用总结
同步和异步:与消息的通知机制有关. 本质区别 现实例子 同步模式 由处理消息者自己去等待消息是否被触发 我去银行办理业务,选择排队等,排到头了就办理. 异步模式 由触发机制来通知处理消息者 我去银行办 ...
最新文章
- iPhoneX延迟这么久预订,真实原因连库克也没料到
- 在MFC中创建动态控件的生成与响应
- python新手遇到的5大坑
- Android如何把 内容复制到剪贴板
- exists的用法 python_5 年 Python ,总结的 10 条 Python 使用技巧
- android linearlayout 方法,android布局----LinearLayout布局方式
- 约瑟夫环 java_约瑟夫环Java实现
- 与詹金斯一起连续交付Heroku
- mysql编译安装root密码_MySQL 5.7.11编译安装以及修改root密码小结
- 命令行调用dubbo服务
- mysql join 组合索引,图文详解MySQL中两表关联的连接表如何创建索引
- 近似推断:使用高斯混合模型
- 简单的三层框架以及使用dbutils进行数据库操作(入门)
- CSS布局大全-案例
- 好程序员分享大数据入门教程:Hadoop和spark的性能比较
- 上汽通用凯迪拉克汽车的多媒体系统不能识别u盘的解决方法
- 2021-09-07体脂秤模块用来做什么?开发八电极体脂秤方案
- 调用函数printchs输出星号图
- 车载以太网100base-T1
- 12306验证码识别初尝试(2)-百度通用文字识别-成功率约75%