想在QT上移植一个FTP服务器程序,先学习windows下的FTP服务器例子,然后随便动手写点东西。

  在pudn上搜索 "FTP服务器端和客户端实现 VC“这几个关键字,就可以搜到下面要分析的这段代码。

  软件结构大概是这样的,CServerDlg类是应用程序的主窗口类,当点击了控件栏上的开始按钮后,在消息响应函数中就创建了FTP服务器的监听socket。

 void CServerDlg::OnStart()
{
// TODO: Add your command handler code here
if (m_bRunning)
return; // created the listen socket
if (m_ListenSocket.Create(m_ControlPort))
{
// start listening
if (m_ListenSocket.Listen())
{
m_ListenSocket.m_pWndDlg = this;
m_bRunning = TRUE; AddTraceLine(AfxGetThread()->m_nThreadID, "服务器在端口 %d 启动成功.", m_ControlPort);
m_wndToolBar.GetToolBarCtrl().EnableButton(IDC_START, !m_bRunning);
m_wndToolBar.GetToolBarCtrl().EnableButton(IDC_STOP, m_bRunning);
m_wndStatusBar.SetPaneText(, "服务器正在运行中", TRUE);
return;
}
}
AddTraceLine(AfxGetThread()->m_nThreadID, "服务器不能在端口 %d 启动,请检查是否有其他程序占用此端口.", m_ControlPort);
}

  第8行创建了一个监听端口,m_ListenSocket是CListenSocket类对象,CListenSocket是下一个要分析的类。FTP的监听端口被固定为了21,即第8行的变量m_ControlPort = 21。然后就是m_ListenSocket.Listen,在这个套接字上监听。使用CAsyncSocket写一个tcp服务器的话基本也是这两步。AfxGetThread()获取当前线程类对象指针。下面再简要介绍下FTP的网络通信模型。

  FTP跟tcp协议一样,是服务器客户端结构。当然FTP是在tcp协议层之上的,FTP服务器使用了3个tcp套接字,FTP客户端使用了2个tcp套接字。FTP服务器必须要有一个tcp监听服务套接字,也就是上面函数中的m_ListenSocket,它监听的端口是固定的-21。然后当一个客户端连接上来以后(C端用了一个socket,S端对应一个socket),服务器和客户端用这个连接上来的套接字作为控制命令信息socket。C和S之间的控制命令信息传输就使用这两个socket,FTP协议是文件传输协议,那么文件数据的传输是怎么传输的呢,CS之间另开了一个socket专门传输数据,至于怎么开的这个数据传输socket,要从后面的分析来看了,我也忘了。这段话解释了FTP通信的基本结构了。后面的一切都好解释了。

  先来看服务器的监听套接字类--CListenSocket,除去构造函数和析构函数就剩一个函数--OnAccept,这也间接说明了监听套接字的唯一功能。OnAccept函数是CAsyncSocket类的一个虚函数,子类重载了此函数。当有客户端连接时函数被调用。

 void CListenSocket::OnAccept(int nErrorCode)
{
// New connection is being established
CSocket sock; // Accept the connection using a temp CSocket object.
Accept(sock); // Create a thread to handle the connection. The thread is created suspended so that we can
// set variables in CConnectThread before it starts executing.
CClientThread* pThread = (CClientThread*)AfxBeginThread(RUNTIME_CLASS(CClientThread), THREAD_PRIORITY_NORMAL, , CREATE_SUSPENDED);
if (!pThread)
{
sock.Close();
TRACE("Could not create thread\n");
return;
} CServerDlg* pDlg = (CServerDlg*) m_pWndDlg; // set members of CClientThread.m_socket
pThread->m_ControlSocket.m_pCriticalSection = &pDlg->m_CriticalSection;
pThread->m_hWndOwner = m_pWndDlg->GetSafeHwnd(); pDlg->m_CriticalSection.Lock();
// since everything is successful, add the thread to our list
pDlg->m_ThreadList.AddTail(pThread);
pDlg->m_CriticalSection.Unlock(); // Pass the socket to the thread by passing the socket handle. You cannot pass
// a CSocket object across threads.
pThread->m_hSocket = sock.Detach(); // Now start the thread.
pThread->ResumeThread(); CAsyncSocket::OnAccept(nErrorCode);
}

  第7行,得到了连接上来的套接字,保存在临时变量sock中。第11行,开了一个线程。这也是这个程序考虑得比较周全的地方,它将数据传输控制socket和数据传输socket封装在了一个线程对象中统一管理,增加了服务器对多客户端的反应能力--多线程的功能本来就这样。AfxBeginThread的原型如下:

  CWinThread* AFXAPI AfxBeginThread(
  CRuntimeClass* pThreadClass,   //从CWinThread派生的RUNTIME_CLASS类
  int nPriority,                             //指定线程优先级,如果为0,则与创建该线程的线程相同
  UINT nStackSize,                      //指定线程的堆栈大小,如果为0,则与创建该线程的线程相同
  DWORD dwCreateFlags,            //一个创建标识,如果是CREATE_SUSPENDED,则在悬挂状态创建线程,在线程创建后线程挂起,否则线程在创建后开始线程的执行。
  LPSECURITY_ATTRIBUTES lpSecurityAttrs) //参数5表示线程的安全属性,NT下有用
  AfxBeginThread有两种,工作者线程和用户界面线程。
  继续上面的代码,后面将主程序窗口句柄传递给线程对象类,主要是为了好给主程序窗口发送消息。第32行,pThread->m_hSocket = sock.Detach();
     此成员函数从CAsyncSocket对象中撤消m_hSocket数据成员中的SOCKET句柄。
     第35行,pThread->ResumeThread();开始让这个线程运行。
   总结一下,CListenSocket就实现了客户端连接处理函数OnAccept,接收到一个客户端请求以后,就新建一个客户端线程,将节目句柄和这个客户端的socket句柄hSocket传递给了这个线程对象。

VC FTP服务器程序分析(一)的更多相关文章

  1. VC FTP服务器程序分析(二)

    上面讲到了CClientThread类,打开这个类的实现,这个类实现了4个函数.依次分析: 1.InitInstance   其说明如下:InitInstance必须被重载以初始化每个用户界面线程的新 ...

  2. VC FTP服务器程序分析(三)

    CControlSocket类的分析,CControlSocket类的内容比较多,为什么呢.因为通信控制命令的传输全部在这里,通信协议的多样也导致了协议解析的多样. 1.OnReceive  其大致说 ...

  3. VC FTP服务器程序分析(四)

    下面是数据传输的重点-CDataSocket类,函数不多,都比较重要. 1.OnAccept  数据tcp服务器被连接的虚函数,由框架调用. void CDataSocket::OnAccept(in ...

  4. 搭建ftp服务器实现文件共享

    FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务. FTP(File Transfer Protocol ...

  5. centos yum安装与配置vsFTPd FTP服务器(转)

    vsftpd作为FTP服务器,在Linux系统中是非常常用的.下面我们介绍如何在centos系统上安装vsftp. 什么是vsftpd vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序 ...

  6. [CentOs7]搭建ftp服务器

    摘要 vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点.vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux. ...

  7. 在阿里云主机上基于CentOS用vsftpd搭建FTP服务器

    最近需要在一台阿里云的云服务器上搭建FTP服务器,在这篇博文中分享一下我们根据实际需求进行的一些配置. ftp软件用的是vsftpd. vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序 ...

  8. 什么是FTP服务器

    FTP服务器,则是在互联网上提供存储空间的计算机,它们依照FTP协议提供服务. FTP的全称是File Transfer Protocol(文件传输协议).顾名思义,就是专门用来传输文件的协议.简单地 ...

  9. Android中FTP服务器搭建入门

    http://www.2cto.com/kf/201501/374048.html http://blog.csdn.net/smile3670/article/details/44343617  有 ...

随机推荐

  1. 【Luogu】P2331最大子矩阵(DP)

    题目链接 这题的状态转移方程真是粗鄙. f[i][j][k]表示前i行用了j个矩阵状态为k的时候的最大值. k=0:两列都不选. k=1:取左弃右. k=2:选右弃左. k=3:左右都选,但分属于两个 ...

  2. 【Luogu】P1594护卫队(前缀和+DP)

    TM搞了半天的二维DP方程还是错的. 这是题目链接: 设f[i]表示前i辆车顺利通过的最小时间. 则对于每一个i枚举该组车的起点j,然后从所有的f[j]+Min[j][i]中选一个最小的. Min[j ...

  3. 【Luogu】P1681最大正方形2(异或运算,DP)

    题目链接 不得不说attack是个天才.读入使用异或运算,令que[i][j]^=(i^j)&1,于是原题目变成了求que数组的最大相同值. 然而我还是不理解为啥,而且就算简化成这样我也不会做 ...

  4. 学习系列 - 马拉车&扩展KMP

    Manacher(马拉车)是一种求最长回文串的线性算法,复杂度O(n).网上对其介绍的资料已经挺多了的,请善用搜索引擎. 而扩展KMP说白了就是是求模式串和主串的每一个后缀的最长公共前缀[KMP更像是 ...

  5. BZOJ 4516 [Sdoi2016]生成魔咒 ——后缀自动机

    本质不同的字串,考虑SA的做法,比较弱,貌似不会. 好吧,只好用SAM了,由于后缀自动机的状态最简的性质, 所有不同的字串就是∑l[i]-l[fa[i]], 然后后缀自动机是可以在线的,然后维护一下就 ...

  6. 算法复习——欧拉函数(poj3090)

    题目: Description A lattice point (x, y) in the first quadrant (x and y are integers greater than or e ...

  7. JQuery Mobile 的引用代码,以及在手机浏览器上字体太小的解决办法

    JQuery Mobile 的引用代码: <link rel="stylesheet" href="http://code.jquery.com/mobile/1. ...

  8. 征途(bzoj 4518)

    Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜 ...

  9. spring 容器bean

    bean配置信息----> 读取bean的配置信息到bean的注册表中---> 根据注册表的信息实例化bean---> 将bean的实例放到spring的容器中---> 应用程 ...

  10. H5页面基于iScroll.js插件实现下拉刷新,上拉加载更多

    前言 在我之前的项目中,页面总是干巴巴的,用户的体验不是特别完美,我也是一直觉得把设计师给到的psd做出来就好,很少考虑用户的感受.我喜欢看不同的App,操作每个步骤,观赏每个能和我互动的交互设计效果 ...