同步模式下的端口映射程序
今天打算寫一個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
總結
以上是生活随笔為你收集整理的同步模式下的端口映射程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wpf控件设计时支持(3)
- 下一篇: 关于jquery的ajax编码的另类解决