函数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))

{

wordpress公司网站模板 wordpress简洁高级通用公司主题

wordpress公司网站模板,wordpresss简洁风格的高级通用自适应网站效果,完美自适应支持多终端移动屏幕设备功能,高级可视化后台自定义管理模块+规范高效的搜索优化。wordpress公司网站模板采用标准的HTML5+CSS3语言开发,兼容当下的各种主流浏览器: IE 6+(以及类似360、遨游等基于IE内核的)、Firefox、Google Chrome、Safari、Opera等;同时...

欧路云(22元/月),美国CERA弹性云服务器!香港弹性云服务器15元/月起;加拿大高防vps仅23元/月起

欧路云怎么样?欧路云主要运行弹性云服务器,可自由定制配置,可选加拿大的480G超高防系列,也可以选择美国(200G高防)系列,也有速度直逼内地的香港CN2系列。所有配置都可以在下单的时候自行根据项目 需求来定制自由升级降级 (降级按天数配置费用 退款回预存款)。2021年7月14日美国 CERA 弹性云服务器 上新 联通CUVIP 线路!8折特惠中!点击进入:欧路云官方网站地址付款方式:PayPa...

GigsGigsCloud 春节优惠2022 指定云服务器VPS主机85折循环优惠码

GigsGigsCloud商家在之前介绍的还是比较多的,因为之前我一直有几台机器在使用,只是最近几年网站都陆续转型删除掉不少的网站和闲置域名,包括今年也都减少网站开始转型自媒体方向。GigsGigsCloud 商家产品还是比较有特色的,有提供香港、新加坡等亚洲机房的云服务器、VPS和独立服务器等。第一、新春优惠活动优惠码:CNY2022-15OFF截止到正月初二,我们可以使用上述优惠码在购买指定G...

ftp服务器地址为你推荐
杀毒软件哪个好最好的杀毒软件?浏览器哪个好用浏览器哪个最好用?手机管家哪个好最好的手机管家清理手机垃圾软件哪个好手机垃圾清理软件哪个好电信dns服务器地址电信光纤的dns地址怎么设置360云盘网页版网页版360云盘打不开,求助!360云查杀360云查杀和360杀毒有什么区别吗?360云盘关闭360云盘,关闭了吗,还能用吗,推荐一个其他云盘360云盘36t现在360云盘不能免费领取36T了吗?活动到期了?怎么领取更多空间?详细步骤和地址。便宜的反义词便宜的近义词是什么
电信服务器租赁 重庆vps租用 免费com域名申请 greengeeks 免费申请网页 美国主机代购 gitcafe godaddy域名转出 服务器日志分析 国外免费空间 牛人与腾讯客服对话 免费全能空间 河南服务器 qq数据库下载 骨干网络 太原联通测速平台 135邮箱 泉州电信 速度云 泉州移动 更多