函数ftp服务器与客户端设计与开发

ftp服务器地址  时间:2021-01-30  阅读:()

FTP服务器与客户端设计与开发

详细设计

程序包括5个主要功能

1.服务器的运行:启动和停止FTP服务

2.用户管理添加用户,删除用户和设置用户权限

3.服务器配置设置服务器开放端口,最大连接数等

4.运行统计:统计当前服务器运行时期上传下载的流量等等

5.安全设置允许连接服务器的IP列表以及禁止访问的IP

服务器的运行模块

功能负责F服务器的运行。

使用类 类,CAplic  i Dg类 CListnSocket类 Cnecthread类 ConnctS ockt类

各种类的功能

1.C类是CWnd的子类作为程序的顶层类负责实现或者调用各个成员函数

2.Aplica ionDg类:CDialog类的子类,实现程序主窗口。

3.CLi  tenSoket类负责监听T客户端连接,并实现有效连接

4.ConnectThred类:负责实现并保证多个连接的有效性。

5.CnnectScket类实现FTP命令的解析,数据的发送和接收

类

作为服务器的顶层类实现服务器开始运行时的所有成员函数

申明如下:

lass  :pulic Cd

{fr  ed CCnnec  ockt;/CConnectocke 作为其友元类,可以访问内部私有数据成员publi:

 void StGoodbyeMessage CTSTR pszTxt ;/发送退出信息

 vod SetWl eMessae(LPCTSTR lpszTet ;/发送欢迎信息

oid Setmeout(i  al );设置暂停时间

oid SetPo t(it nValue)  //设置端口vod   xUse  s int nVa ue ;//设置最大连接数

 void StSta isticsInterval(int ale);//统计时间间隔

 O O IsActie();/是否有效

 void S o() 

 BOOL S art );

() vir ualC();

 CU rManaer //用户管理对象

 CSecurityanager;/安全策略

类

最主要的成员函数是start(和stop ) 分别负责ftp服务器的开始运行和结束运行函数声明如下:

/*  ******* ** ****  ********  ***** ******** 

********/

/*        /

*Funtin ame :Start      *

 De  cr ptio :Strt li   inin on  rt 1 an accpt new //*   onnec  ions     */

/        *

** ******************  ****************************

**/

BOOLC()

{if (munnng)

      n FALSE;/如果运行,返回错误标志

/crea  dm wndow for me  sag  u i 

 f(!Cd::Cr   Ex(0 AxRgis  erWndC as s(0),  N  ifica in ink",S_PPUP,   0,0,0 NL,   )

 dTacine  , Fild to create notifia  on w dow.");return FALSE;

/开始创建socketif misteSockt.Cr te m_ort))

{

  //  tr   i  teningi  (mL s  enocket.Listn( )

{

  _ListeSocet._pWdSe ve  = h  

  m_bR ning= T RU;

 S e Timer(  ,m_nStt   ticsInterval,NUL ;

  d;

 }

 

 AdTrceLin(0, " faild to    tn o port%.  ,mPort);

/de  troy no  ficatio indow

 f(IsWnow(m_hWd )

  Destr no();

 mhWnd  N ULL;

 rturn FALE;

}

*  *****************************************

*********

/*          */

/*Fuction ame  Stp     /

*D e  cription  S top .    */

/*         /

/********************************* ********** *************voi C()

 if !m_bunning

 rturn;

// stop sttist  cs timer

Killim e r 1 

_Running FALS E m_i  te ocket.lo ( ;

CnnetThre ad*pThr d=ULL;

//     e ll rnning thred

 d

{

  m_C  ti lec  in.Lock();

 POSITION os _Th ad  s  .GetedPositin();

  (po !=NULL)

 {

   pThead (CConec Thred*)mTreadist.etAt(os) 

 

_C  t  ca  ec  in Un ok( ;

 / save trea membrsin nT hr e aID= pTr  ->_nT he aI

  HN D L hThr ea = T ed-m_hr e a;

   AddTracLine(0, " %d]Sht ing  wn t ed.. .   hreadD   //tll hread to stop

 pThed- threadPr  or  tyTHEAD_PRITYHIHT ;  Thread>PostTh adMssge(_QUI,0,0);

  / wa  t for hrad o end,while keepin te m   ges umping(x 5 scods)

  i  (i WithM   aeo op(hTrad,50)== FALS)

   //

    AdTrceLne(0, "[]Problmhil killig thread.  , nTreadID);

  //dn't t y agai, so remov

   m_r  ticlS ectin.c();

  POSION rmPo m_Tr dList.Fn phread);

 if(rmP o s  =NULL)

  _TheadLis   RmveA (rmPos);

 mritica  ection.Un oc );

  }

   el  

{

   AddTraceLine(0 "[%]Thread scce  sfully stpe." nThredID); }

  }

 else

 {m_Criticaletion.Un o () 

  pThea =NUL;

 

}

hi  e (pT he a != N ULL) 

AdracLne 0, "  topped " 

 if(I  do(hWn))

Ds  r oWino( 

 m_n =NUL;

}

Ci  t Scket类

用于监听每个客户的连接,CLi  teSockt类是CAsyncSockt的子类其成员函数 isten

监听来自客户端的连接,当监听到可以接收的socket的时候通过OAccept函数准备创建有效连接的进程。

函数如下vid CL  tnSoket: :OnAcept  nt nErrrCoe)

/New  nec   on is eing estali he

CSoket scki  

Acept th connct  on sing a te CSckt obj t.

Accept(socki  );

/ Create a tred t hndl te connection. Th t  ad i  reaed suspended so hat we can

/ st ariab e  in onnctTh ead before  t sta   s execut n. CConectTrea  pThread=(onetThrea*)AfxegnThrad(RUNTI_CAS S(ConnctThread), THEAD_IRIY_ORMA 0, CRASUSENED);

  f (!pTh ad)

{socki   lo e() 

 RAE "Could not ra  theadn");

   tun;

}

C*Wn =(C*m_pWnder r;

 ine eve ytig  s suces  fl, dd the thr d t ou li  t Wn->mriticalS e  ion ock  ;pWnd->mThreadList.AddTail(pThead) 

Wnd->m_ri  i lSetion.Un ock( ;

//  ae pointer

 pTrad-WnSr r= Wde ve  ;

 //Pass the socke  to the the    passig he so  t hndle You nnot pa 

/ a Cocketojectacross   eads.

Trea->mS oce  =sockit.et h();

 // w  ta  t th  read.

 pThread>Re umeThread( 

}

CConnecthead类

CCnnectThead类负责为每个有效进程创建一个线程,每个进程完成数据传输的所有任务,穿件县城后通过 itInstance完成线程的初始化

OOL C nectThread :Ii  ns  ance()

{

 try

 {

 //Attac the socke  handle to a Sce  objct.

/ Th  make   re tat te ocke  noti ications are sent to th thread.

 mConnctSockt.ttch(m_hSo e  ) 

  _ConectS ocktm_pThred= his

Strig strIPdd s  ;

IT Por  ;

 m_o ec  ocket GtPeerNam(  trIPAddrss, P  t ;

  /otif se  e  that there

  m_pWnd rvr->ene  sg(_HRASTAR, (WPARA th s,);

 i  (( C*m_W Se ver ->ChecMaUsrs  )

connectd 

 P  ThredMssage(_UIT,0 0);

}

  e  se

 if( (C*)mWdServer -I  IPddre  sA lowd(strIPAddress))

 {

  y te server.");

     tTredMessage(WM_UIT,,);

}e  se

  

 / send wlom messge o client

  C  rin strText =((C* _nd rvr)->Get  cmeessge( ;

;

 m_ime  I =  :SetTmer(UL,0, 000,TmerProc ;

 }

 }

 ath(Exception *e)

 {

 e->Dle  e( ;

}

   urn TRUE;

}

线程结束以后通过Ei  Instnce函数实现资源的释放代码如下:

n CCnnectThread:  xitIstance(

C *pWnd  (C )m_pWndS e ver;try

 {

 pWnd->m_Cr  ti lSc    .Lo ();

/ d  t th   read rom the line li  

 POSIION ps= Wnd-m_TheaL s  .Find(t  s);

    (pos ! NUL)

 {

 pnd>m_radLi   .Rmovt ps);

 }

 pWnd-m_Cri  ialS ec  ion.Unlock(); 

 // notify service main lop

 pWn->SendMe  sge(_HEDCLOS, (WPARAM)this,  

}

 catch(Eception

 {pWd->_  i  iclS ect  on.Unlock() 

 e-Del  e() 

}retur CWinThread: :Eit  stance( ;

}

为了了解传输过程中接收和发送的字节数使用ncRecei  tes和IncSentytes来计算。这两个函数在Connec   ce 类中调用,代码如下:

oid CConctTr d: :IncSntte  in nByte  

m_L  Dtrans erTie = Cie: :Ge urrentTm();

 

 // n  i   serer class

 mnd rer-Ps e s sag WM_THREAMS, (WPARA 0, (LPAAM)nB y e   ;

}

vid CConnectThead  InRce vedByte  (int nytes)

{

 m_a tD ataTras e Tme =Cme:  e CrrentTime();

 _nRceived  e  +=nBytes;

/noti y  erver   ass

 m_pndS erver->Po tes  age(WM_THREADS G, (WPAA)1  (LPARAnBytes) 

CConnectocke 类

每个线程都是通过一个CConetocke 对象m_onectScket来完成数据的接受和发送。当线程创建成功以后m_ConnectS  et对象通过nReceiv函数获得数据,然后利用ParseCommand函数来解析其中FT命令vid Connect cket: :OnRce  e(i  nErrorCode)

 THR bff[BUFFRS ZE ;it nReadReeive(buf, FFERS Z);

wi  ch (Read)

  case 0:

  Close() 

  bek;

 case SCKET_EROR

 if (e LstError(  =WSEWO ULB LO)

 {

  TCA szError[256 ;wpritf srror());  

   fxss eBox(  rror 

 }

  bea;

  efault:

  f(Read  = O C KET_ROR& Read != 0)

 {

   ((ConnetThead*)AfGe Thr d())>InReceivdBy sRed);  /te minate he str  g

   buf[nead]=  

  m_RxB u ff  += S trin(bff) 

  

  e tRLin ) 

  }

 rek;

 }

Cokt: :Onec  e(nErr Cod) 

}

ParseComnd函数

是当前程序最重要的一个部分它根据客户端提交的各种命令进行相应的操作代码如下vid ConnctSck  :  PrsCmad()

{

 sta i C ommanList ]=

 {

  {O KUR  "U S E",RU ,

 {T O_PAS "PAS S  , RUE ,

 _CW  "", TRUE} 

 TOKPWD, "WD", FASE} 

{_OR, POT", TR ,

 {T O K_ASV PAS , FLS E},

 {OK_YP, "TYPE",TRU},

 {TK_LIT, "I", ALE},

  {T_RST, REST",RUE},

  {TO_CDUP  "CDUP"  FALSE ,

 {T O K_ET R  "ETR",T RE},

 {TOK_STOR, "STO  T},

  TOK_IZ "IZ" TRU},

 {O KD ELE, "DL",TRU} 

 TOK_MD  "MD", TRE},

 {K_KD, M KD", RU E},

 {T O K_NR, "RNF",T RU E},

{TK_RTO, RTO",TRU ,

 TOK_ABOR "ABO  ALSE ,

 {T O K_SYST, "SYST", FALE ,

 TOK_NOOP, "OOP , FALS} 

TO_BY,    , FALS ,

{TOKQT, "UT", FASE},

  {TOK_ROR  "", FLS},

 ;

/ parse comman

C  ring strCommnd st Aget  if(!etRxomad(st Cmmand  rArguments))

{

个人网站备案流程及注意事项(内容方向和适用主机商)

如今我们还有在做个人网站吗?随着自媒体和短视频的发展和兴起,包括我们很多WEB2.0产品的延续,当然也包括个人建站市场的低迷和用户关注的不同,有些个人已经不在做网站。但是,由于我们有些朋友出于网站的爱好或者说是有些项目还是基于PC端网站的,还是有网友抱有信心的,比如我们看到有一些老牌个人网站依旧在运行,且还有新网站的出现。今天在这篇文章中谈谈有网友问关于个人网站备案的问题。这个也是前几天有他在选择...

Virtono:圣何塞VPS七五折月付2.2欧元起,免费双倍内存

Virtono是一家成立于2014年的国外VPS主机商,提供VPS和服务器租用等产品,商家支持PayPal、信用卡、支付宝等国内外付款方式,可选数据中心共7个:罗马尼亚2个,美国3个(圣何塞、达拉斯、迈阿密),英国和德国各1个。目前,商家针对美国圣何塞机房VPS提供75折优惠码,同时,下单后在LET回复订单号还能获得双倍内存的升级。下面以圣何塞为例,分享几款VPS主机配置信息。Cloud VPSC...

恒创新客(317元)香港云服务器 2M带宽 三网CN2线路直连

恒创科技也有暑期的活动,其中香港服务器也有一定折扣,当然是针对新用户的,如果我们还没有注册过或者可以有办法注册到新用户的,可以买他们家的香港服务器活动价格,2M带宽香港云服务器317元。对于一般用途还是够用的。 活动链接:恒创暑期活动爆款活动均是针对新用户的。1、云服务器仅限首次购买恒创科技产品的新用户。1 核 1G 实例规格,单个账户限购 1台;其他活动机型,单个账户限购 3 台(必须在一个订单...

ftp服务器地址为你推荐
电脑杀毒软件哪个好电脑杀毒软件那个最好??机械表和石英表哪个好手表石英和机械哪个好朗逸和速腾哪个好买同等价位的朗逸和速腾哪个好?二手车网站哪个好二手车交易网哪个好?炒股软件哪个好股票软件哪个最好用?炒股软件哪个好用股票交易软件哪个好?dnf魔枪士转职哪个好DNF魔枪士转职转哪个好 决战者征战者转职播放器哪个好什么播放器好用网络机顶盒哪个好机顶盒哪个好用空间登录器qq空间登录电脑版
手机网站空间 备案域名出售 花生壳域名贝锐 罗马假日广场 国内免备案主机 网站挂马检测工具 炎黄盛世 vip购优惠 独立主机 贵阳电信 lamp什么意思 七牛云存储 cdn服务 谷歌搜索打不开 脚本大全 湖南铁通 .htaccess 此网页包含的内容将不使用安全的https 时间同步服务器 日本小学生 更多