上面讲到了CClientThread类,打开这个类的实现,这个类实现了4个函数。依次分析:

  1、InitInstance   其说明如下:InitInstance必须被重载以初始化每个用户界面线程的新实例。统称,你重载InitInstance函数来执行当线程首次被创建时必须完成的任务。此成员函数仅在用户界面线程中使用。

  1. BOOL CClientThread::InitInstance()
  2. {
  3. // Attach the socket handle to a CSocket object.
  4. // This makes sure that the socket notifications are sent to this thread.
  5. m_ControlSocket.Attach(m_hSocket);
  6. m_ControlSocket.m_pThread = this;
  7.  
  8. // send welcome message to client
  9. m_ControlSocket.SendResponse("220 欢迎使用CC的FTP 服务器!!!");
  10.  
  11. UINT nPort;
  12. m_ControlSocket.GetPeerName(m_strPeerName, nPort);
  13.  
  14. // dynamically allocate memory for IP address (receiver will delete it!)
  15. int nLength = m_strPeerName.GetLength();
  16. LPSTR lpszPeerName = new char[nLength+];
  17. lstrcpy(lpszPeerName, m_strPeerName);
  18.  
  19. // Post a message to the main thread so that it can update the number of open connections
  20. ::PostMessage(m_hWndOwner, WM_THREADSTART, (WPARAM)lpszPeerName, (LPARAM)m_nThreadID);
  21. return TRUE;
  22. }

 第5行,m_ControlSocket类关联了m_hSocket句柄,m_hSocket是在创建线程对象之后传递进来的。m_ControlSocket是与客户端通信使用的控制命令套接字。第9行,调用了m_ControlSocket的成员函数SendResponse。这里涉及到CControlSocket类,这个类下篇分析再讲。这里就是给客户端回复了一个信息,信息里面为什么是220,这里就是具体的通信协议了,后面再讲。

 第11至20,就是将客户端信息显示在主窗口上面了。

 2、ExitInstance  其说明如下:框架通过很少被重载的Run成员函数调用此函数以退出线程的这个实例;或者当调用InitInstance失败时,调用此函数。除了在Run成员函数内之外,不得在任何地方调用此成员函数。此成员函数仅被用户界面线程使用。当m_bAutoDelete为真时,此函数的缺省实现删除CWinThread对象。如果你希望当线程终止时执行额外的清除工作,请重载此函数。当你的程序代码被执行之后,你的ExitInstance实现应调用基类的ExitInstance函数。

  1. int CClientThread::ExitInstance()
  2. {
  3. // delete this thread from the linked list
  4. CServerDlg *pWnd = (CServerDlg *)AfxGetApp()->m_pMainWnd;
  5. if (pWnd != NULL)
  6. {
  7. pWnd->m_CriticalSection.Lock();
  8. POSITION pos = pWnd->m_ThreadList.Find(this);
  9. if(pos != NULL)
  10. {
  11. pWnd->m_ThreadList.RemoveAt(pos);
  12. }
  13. pWnd->m_CriticalSection.Unlock();
  14. }
  15. // dynamically allocate memory for IP address (receiver will delete it!)
  16. int nLength = m_strPeerName.GetLength();
  17. LPSTR lpszPeerName = new char[nLength+];
  18. lstrcpy(lpszPeerName, m_strPeerName);
  19.  
  20. // Post message to the main thread that this socket connection has closed
  21. ::PostMessage(m_hWndOwner, WM_THREADCLOSE, (WPARAM)lpszPeerName, (LPARAM)m_nThreadID);
  22. return CWinThread::ExitInstance();
  23. }

  上面这个函数,第4至14行 删除了在界面类中保存的本线程对象指针。第16至21行,给界面发送了线程退出的消息。

  3、PostStatusMessage函数,此函数就是在给主窗口发送消息。

  1. void CClientThread::PostStatusMessage(LPCTSTR lpszStatus)
  2. {
  3. CString strData = lpszStatus;
  4.  
  5. int nLength = strData.GetLength();
  6.  
  7. // dynamically allocate memory for status message (receiver will delete it!)
  8. LPSTR lpszData = new char[nLength+];
  9. lstrcpy(lpszData, strData);
  10. ::PostMessage(m_hWndOwner, WM_ADDTRACELINE, (WPARAM)lpszData, (LPARAM)m_nThreadID);
  11. }

  WM_ADDTRACELINE从字面上看就是增加一条记录信息。

  4、OnDestroyDataConnection  这是一个消息响应函数,也就是一个线程对象如果去接收并处理一个消息,这就是个很好的例子了。

  1. BEGIN_MESSAGE_MAP(CClientThread, CWinThread)
  2. //{{AFX_MSG_MAP(CClientThread)
  3. // NOTE - the ClassWizard will add and remove mapping macros here.
  4. //}}AFX_MSG_MAP
  5. ON_THREAD_MESSAGE(WM_DESTROYDATACONNECTION, OnDestroyDataConnection)
  6. END_MESSAGE_MAP()
  7.  
  8. void CClientThread::OnDestroyDataConnection(WPARAM wParam, LPARAM lParam)
  9. {
  10. m_ControlSocket.DestroyDataConnection();
  11. }

  这里调用了CControlSocket类的成员函数DestroyDataConnection。下面就分析CConntrolSocket类的实现。

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

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

    想在QT上移植一个FTP服务器程序,先学习windows下的FTP服务器例子,然后随便动手写点东西. 在pudn上搜索 "FTP服务器端和客户端实现 VC“这几个关键字,就可以搜到下面要分析 ...

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

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

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

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

  4. Linux基础篇之FTP服务器搭建(二)

    上一篇文章说到了搭建FTP匿名用户的访问,接下来讲解一下本地用户的登录. 一.首先先建立一个用户,这里举例:xiaoming,并为其设置密码.  二.修改配置文件. 文件:ftpusers 文件:us ...

  5. ftp服务器搭建(二)

    1.已经安装好了vsftpd  进入到根目录下的/etc目录 ls查看一下 2.拷贝一下上面的两个配置文件 我拷贝到了我新建的目录中了 3.查看现在的网络连接方式——我的是-net方式 当然其他方式也 ...

  6. 魔兽世界服务器Trinitycore分析二:auth server的main函数

    TrinityCore由生成两个运行文件authserver和world server以及一堆DLL(或so)文件的子项目组成(先忽略map_extractor等几个工具项目). authserver ...

  7. 转:【专题十二】实现一个简单的FTP服务器

    引言: 休息一个国庆节后好久没有更新文章了,主要是刚开始休息完心态还没有调整过来的, 现在差不多进入状态了, 所以继续和大家分享下网络编程的知识,在本专题中将和大家分享如何自己实现一个简单的FTP服务 ...

  8. 专题十二:实现一个简单的FTP服务器

    引言: 在本专题中将和大家分享如何自己实现一个简单的FTP服务器.在我们平时的上网过程中,一般都是使用FTP的客户端来对商家提供的服务器进行访问(上传.下载文件),例如我们经常用到微软的SkyDriv ...

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

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

随机推荐

  1. 西南民大oj 1762 我的式子不可能那么难写 【波兰式】

    描述 啦啦啦.作为一个苦逼的程序猿.?.请看下图... 现在老总想让你帮他儿子写个简单计算器(他儿子小学3年级,嘘!),写不出来就扣奖金..快帮他写吧... 给一个包含+-*/()的正确的表达式.要你 ...

  2. 【2018.11.23】2018WCTest(8)

    T1 小 $X$ 无敌就是指他的防御 $\ge$ 怪物的攻击 $n$.另外小 $X$ 最多只需要把攻击加到怪物的防御 $k$,此时已经能一招秒一个,再多加必定无用且需承受更多伤害. $20$ 分 $d ...

  3. [无趣]bit reverse

    真不想承认啊,因为年轻而犯下的错误! inline void _BR(int* a,int r){ for(int i=0,j=1;i<r;++i,j<<=1){ for(int k ...

  4. Spoj-DRUIDEOI Fata7y Ya Warda!

    Fata7y Ya Warda! Druid (AKA Amr Alaa El-Deen) and little EOIers have finished their training and the ...

  5. BZOJ4726: [POI2017]Sabota?

    $n \leq 500000$的树,开始有一个点是坏的,如果一个子树中坏点比例(不包括根节点)超过x那这整棵子树就会变坏,问最坏情况下不超过$K$个坏点的情况下$x$最小是多少. 被坑成傻逼.. 可以 ...

  6. 【Java TCP/IP Socket】深入剖析socket——TCP通信中由于底层队列填满而造成的死锁问题(含代码)

    基础准备 首先需要明白数据传输的底层实现机制,在http://blog.csdn.net/ns_code/article/details/15813809这篇博客中有详细的介绍,在上面的博客中,我们提 ...

  7. Word中将文本框、图形对象中的文本边距调整

    在进行word的实际使用中,如下图制作流程图时,常常发现文字在图形对象中,老是显示不全,而且上部却空出很多距离.此时可以通过设置形状格式--文本框 --- 上.下编辑进行设置. 可以完美解决文本框中文 ...

  8. 转:NetBeans的远程Linux C开发实践

    转: http://blog.csdn.net/jacktan/article/details/9268535 一直以来总觉得NetBeans生活在Eclipse的阴影下,同样做为一款不错的基于Jav ...

  9. HDU 2018 母牛的故事 [补]

    今天刚考完试,和杨曙光玩了RPG,实在不想看题了 /***************************************************/ 母牛的故事 Time Limit: 200 ...

  10. cs6 mac 破解方法

    Photoshop CS6 重点功能: 1.Photoshop CS6 包含Photoshop CS6和Photoshop CS6 Extended中所有功能,快去试一试3D图像编辑和Photosho ...