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 ...
随机推荐
- linux 安装软件出现/tmp 磁盘不足时 解决方案
1.解决办法 mkdir 文件夹——你可以使用的文件夹 比如说 mkdir /mnt/tmp 然后只要export TMPDIR=/mnt/tmp 这样就不会出现 tmp文件夹不够用的情况
- 【POJ1226】Substrings(后缀数组,二分)
题意: n<=10,len<=100 思路: 只有一个字符串的时候特判一下 #include<cstdio> #include<cstring> #include& ...
- BZOJ1902: Zju2116 Christopher
$n \leq 10^{100}$,问$C_n^m,0<=m<=n$有多少是质数$p \leq 1e7$的倍数. 一样,套高精度的题,只有战胜他才能鄙视他. 但是我TM被他鄙视了一上午!! ...
- 标准C程序设计七---23
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- android开启线程,异步处理数据实例
package com.example.sywang2; import com.zds.os.R; import android.os.Bundle; import android.os.Handle ...
- WebView跳转到底部
webview中有个computeVerticalScrollRange方法,是protected的,可以用反射,也可以自己写一个view继承webview,实现computeVerticalScro ...
- 最小费用最大流粗解 poj2516
最小费用最大流,一般解法如下: 在流量基础上,每条边还有权费用,即单位流量下的所需费用.在最大流量下,求最小费用.解法:在最大流算法基础上,每次按可行流增广改为每次用spfa按最小费用(用单位费用)增 ...
- HUNAN -11566 Graduation Examination(找规律)
http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11566&courseid=0 输入n,求出第n个fi ...
- MD5进行文件完整性校验的操作方法
我组产品包含大量音频和图片资源,MD5主要就用来检测这些资源文件的完整性.主要思路是:先计算出所有资源文件的MD5值,存到一个xml文件中,作为标准的MD5值.然后把这个xml文件放到我们的产品中,每 ...
- Linux常用C函数-接口处理篇(网络通信函数)
接口处理篇accept,bind,connect,endprotoent,endservent,getsockopt,htonl,htons,inet_addr,inet_aton,inet_ntoa ...