VC FTP服务器程序分析(二)
上面讲到了CClientThread类,打开这个类的实现,这个类实现了4个函数。依次分析:
1、InitInstance 其说明如下:InitInstance必须被重载以初始化每个用户界面线程的新实例。统称,你重载InitInstance函数来执行当线程首次被创建时必须完成的任务。此成员函数仅在用户界面线程中使用。
- BOOL CClientThread::InitInstance()
- {
- // Attach the socket handle to a CSocket object.
- // This makes sure that the socket notifications are sent to this thread.
- m_ControlSocket.Attach(m_hSocket);
- m_ControlSocket.m_pThread = this;
- // send welcome message to client
- m_ControlSocket.SendResponse("220 欢迎使用CC的FTP 服务器!!!");
- UINT nPort;
- m_ControlSocket.GetPeerName(m_strPeerName, nPort);
- // dynamically allocate memory for IP address (receiver will delete it!)
- int nLength = m_strPeerName.GetLength();
- LPSTR lpszPeerName = new char[nLength+];
- lstrcpy(lpszPeerName, m_strPeerName);
- // Post a message to the main thread so that it can update the number of open connections
- ::PostMessage(m_hWndOwner, WM_THREADSTART, (WPARAM)lpszPeerName, (LPARAM)m_nThreadID);
- return TRUE;
- }
第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函数。
- int CClientThread::ExitInstance()
- {
- // delete this thread from the linked list
- CServerDlg *pWnd = (CServerDlg *)AfxGetApp()->m_pMainWnd;
- if (pWnd != NULL)
- {
- pWnd->m_CriticalSection.Lock();
- POSITION pos = pWnd->m_ThreadList.Find(this);
- if(pos != NULL)
- {
- pWnd->m_ThreadList.RemoveAt(pos);
- }
- pWnd->m_CriticalSection.Unlock();
- }
- // dynamically allocate memory for IP address (receiver will delete it!)
- int nLength = m_strPeerName.GetLength();
- LPSTR lpszPeerName = new char[nLength+];
- lstrcpy(lpszPeerName, m_strPeerName);
- // Post message to the main thread that this socket connection has closed
- ::PostMessage(m_hWndOwner, WM_THREADCLOSE, (WPARAM)lpszPeerName, (LPARAM)m_nThreadID);
- return CWinThread::ExitInstance();
- }
上面这个函数,第4至14行 删除了在界面类中保存的本线程对象指针。第16至21行,给界面发送了线程退出的消息。
3、PostStatusMessage函数,此函数就是在给主窗口发送消息。
- void CClientThread::PostStatusMessage(LPCTSTR lpszStatus)
- {
- CString strData = lpszStatus;
- int nLength = strData.GetLength();
- // dynamically allocate memory for status message (receiver will delete it!)
- LPSTR lpszData = new char[nLength+];
- lstrcpy(lpszData, strData);
- ::PostMessage(m_hWndOwner, WM_ADDTRACELINE, (WPARAM)lpszData, (LPARAM)m_nThreadID);
- }
WM_ADDTRACELINE从字面上看就是增加一条记录信息。
4、OnDestroyDataConnection 这是一个消息响应函数,也就是一个线程对象如果去接收并处理一个消息,这就是个很好的例子了。
- BEGIN_MESSAGE_MAP(CClientThread, CWinThread)
- //{{AFX_MSG_MAP(CClientThread)
- // NOTE - the ClassWizard will add and remove mapping macros here.
- //}}AFX_MSG_MAP
- ON_THREAD_MESSAGE(WM_DESTROYDATACONNECTION, OnDestroyDataConnection)
- END_MESSAGE_MAP()
- void CClientThread::OnDestroyDataConnection(WPARAM wParam, LPARAM lParam)
- {
- m_ControlSocket.DestroyDataConnection();
- }
这里调用了CControlSocket类的成员函数DestroyDataConnection。下面就分析CConntrolSocket类的实现。
VC FTP服务器程序分析(二)的更多相关文章
- VC FTP服务器程序分析(一)
想在QT上移植一个FTP服务器程序,先学习windows下的FTP服务器例子,然后随便动手写点东西. 在pudn上搜索 "FTP服务器端和客户端实现 VC“这几个关键字,就可以搜到下面要分析 ...
- VC FTP服务器程序分析(三)
CControlSocket类的分析,CControlSocket类的内容比较多,为什么呢.因为通信控制命令的传输全部在这里,通信协议的多样也导致了协议解析的多样. 1.OnReceive 其大致说 ...
- VC FTP服务器程序分析(四)
下面是数据传输的重点-CDataSocket类,函数不多,都比较重要. 1.OnAccept 数据tcp服务器被连接的虚函数,由框架调用. void CDataSocket::OnAccept(in ...
- Linux基础篇之FTP服务器搭建(二)
上一篇文章说到了搭建FTP匿名用户的访问,接下来讲解一下本地用户的登录. 一.首先先建立一个用户,这里举例:xiaoming,并为其设置密码. 二.修改配置文件. 文件:ftpusers 文件:us ...
- ftp服务器搭建(二)
1.已经安装好了vsftpd 进入到根目录下的/etc目录 ls查看一下 2.拷贝一下上面的两个配置文件 我拷贝到了我新建的目录中了 3.查看现在的网络连接方式——我的是-net方式 当然其他方式也 ...
- 魔兽世界服务器Trinitycore分析二:auth server的main函数
TrinityCore由生成两个运行文件authserver和world server以及一堆DLL(或so)文件的子项目组成(先忽略map_extractor等几个工具项目). authserver ...
- 转:【专题十二】实现一个简单的FTP服务器
引言: 休息一个国庆节后好久没有更新文章了,主要是刚开始休息完心态还没有调整过来的, 现在差不多进入状态了, 所以继续和大家分享下网络编程的知识,在本专题中将和大家分享如何自己实现一个简单的FTP服务 ...
- 专题十二:实现一个简单的FTP服务器
引言: 在本专题中将和大家分享如何自己实现一个简单的FTP服务器.在我们平时的上网过程中,一般都是使用FTP的客户端来对商家提供的服务器进行访问(上传.下载文件),例如我们经常用到微软的SkyDriv ...
- 搭建ftp服务器实现文件共享
FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务. FTP(File Transfer Protocol ...
随机推荐
- 西南民大oj 1762 我的式子不可能那么难写 【波兰式】
描述 啦啦啦.作为一个苦逼的程序猿.?.请看下图... 现在老总想让你帮他儿子写个简单计算器(他儿子小学3年级,嘘!),写不出来就扣奖金..快帮他写吧... 给一个包含+-*/()的正确的表达式.要你 ...
- 【2018.11.23】2018WCTest(8)
T1 小 $X$ 无敌就是指他的防御 $\ge$ 怪物的攻击 $n$.另外小 $X$ 最多只需要把攻击加到怪物的防御 $k$,此时已经能一招秒一个,再多加必定无用且需承受更多伤害. $20$ 分 $d ...
- [无趣]bit reverse
真不想承认啊,因为年轻而犯下的错误! inline void _BR(int* a,int r){ for(int i=0,j=1;i<r;++i,j<<=1){ for(int k ...
- Spoj-DRUIDEOI Fata7y Ya Warda!
Fata7y Ya Warda! Druid (AKA Amr Alaa El-Deen) and little EOIers have finished their training and the ...
- BZOJ4726: [POI2017]Sabota?
$n \leq 500000$的树,开始有一个点是坏的,如果一个子树中坏点比例(不包括根节点)超过x那这整棵子树就会变坏,问最坏情况下不超过$K$个坏点的情况下$x$最小是多少. 被坑成傻逼.. 可以 ...
- 【Java TCP/IP Socket】深入剖析socket——TCP通信中由于底层队列填满而造成的死锁问题(含代码)
基础准备 首先需要明白数据传输的底层实现机制,在http://blog.csdn.net/ns_code/article/details/15813809这篇博客中有详细的介绍,在上面的博客中,我们提 ...
- Word中将文本框、图形对象中的文本边距调整
在进行word的实际使用中,如下图制作流程图时,常常发现文字在图形对象中,老是显示不全,而且上部却空出很多距离.此时可以通过设置形状格式--文本框 --- 上.下编辑进行设置. 可以完美解决文本框中文 ...
- 转:NetBeans的远程Linux C开发实践
转: http://blog.csdn.net/jacktan/article/details/9268535 一直以来总觉得NetBeans生活在Eclipse的阴影下,同样做为一款不错的基于Jav ...
- HDU 2018 母牛的故事 [补]
今天刚考完试,和杨曙光玩了RPG,实在不想看题了 /***************************************************/ 母牛的故事 Time Limit: 200 ...
- cs6 mac 破解方法
Photoshop CS6 重点功能: 1.Photoshop CS6 包含Photoshop CS6和Photoshop CS6 Extended中所有功能,快去试一试3D图像编辑和Photosho ...