服务器端登陆机制的 实现模块
#include<头文件省略>
——核心begin
class CSocket32;//CSocket32 &m_socka实现套接字的引用
class CLogin
{
public:
CLogin(CSocket32& socka);//引用必须初始化
virtual ~CLogin();
inline string &GetUser() {return m_szUser;}//获取 用户名
inline string &GetPath() {return m_szPath;}//获取 可访问目录
inline BOOL IsLoged(){return m_bLogin;}//获取登陆状态
BOOL Login(LPCSTR sKey,string& str);//登陆操作
private:
BOOL USER(string &str);//核对--用户名
BOOL PASS(string &str); //核对--密码
private:
BOOL m_bLogin; //登陆状态
string m_szUser;//用户名
string m_szPass;//密码
string m_szPath;//可访问的目录
CSocket32 &m_socka;//套接字引用
};
——核心end
实现部分
——核心begin
//异常类
class CError
{
const char* m_pError;
public:
CError(const char* p)
{
m_pError = p;
}
const char* what(){return m_pError;}
};
//构造初始
CLogin::CLogin(CSocket32& socka):m_socka(socka),m_bLogin(FALSE)
{
//socka的初始化。*必须*
}
CLogin::~CLogin()
{
}
/*************************************************************/
//1. 登陆操作
BOOL CLogin::Login(LPCSTR sKey,string &str)
{
if(m_bLogin)return TRUE;
try
{
if(!strcmp(sKey,"USER"))//用户名正确
if(USER(str))return TRUE;
if(!strcmp(sKey,"PASS"))//密码正确
if(PASS(str))return TRUE;
}catch(CError &e)//异常返回
{
str = "530 Login incorrect for " + string(e.what()) + "." + CRLF;
m_socka.Send(str.c_str(),str.length());
}
return FALSE;
}
//2. 核对用户名 key=user
BOOL CLogin::USER(string &str)
{
char s[256];
strcpy(s,str.c_str());
strupr(s);
if(!theApp.m_map.count(s))//搜索S在map的个数
{
throw CError("username");
}
m_szUser = s;
str = "331 Password required for "+str+"." + CRLF;
m_socka.Send(str.c_str(),str.length());//用户名无误,返回索取密码消息
return TRUE;
}
//3. 核对密码 value.pass
BOOL CLogin::PASS(string &str)
{
if(theApp.m_map[m_szUser].szPass != str)
{
throw CError("password");
}
m_bLogin = TRUE;
m_szPass = str;
m_szPath = theApp.m_map[m_szUser].szPath;//密码无误,获取可访目录
str = "230 User "+m_szUser +" logged in , proceed." +CRLF;
m_socka.Send(str.c_str(),str.length());
return TRUE;
}
——核心end
#include<头文件省略>
——核心begin
class CSocket32;//CSocket32 &m_socka实现套接字的引用
class CLogin
{
public:
CLogin(CSocket32& socka);//引用必须初始化
virtual ~CLogin();
inline string &GetUser() {return m_szUser;}//获取 用户名
inline string &GetPath() {return m_szPath;}//获取 可访问目录
inline BOOL IsLoged(){return m_bLogin;}//获取登陆状态
BOOL Login(LPCSTR sKey,string& str);//登陆操作
private:
BOOL USER(string &str);//核对--用户名
BOOL PASS(string &str); //核对--密码
private:
BOOL m_bLogin; //登陆状态
string m_szUser;//用户名
string m_szPass;//密码
string m_szPath;//可访问的目录
CSocket32 &m_socka;//套接字引用
};
——核心end
实现部分
——核心begin
//异常类
class CError
{
const char* m_pError;
public:
CError(const char* p)
{
m_pError = p;
}
const char* what(){return m_pError;}
};
//构造初始
CLogin::CLogin(CSocket32& socka):m_socka(socka),m_bLogin(FALSE)
{
//socka的初始化。*必须*
}
CLogin::~CLogin()
{
}
/*************************************************************/
//1. 登陆操作
BOOL CLogin::Login(LPCSTR sKey,string &str)
{
if(m_bLogin)return TRUE;
try
{
if(!strcmp(sKey,"USER"))//用户名正确
if(USER(str))return TRUE;
if(!strcmp(sKey,"PASS"))//密码正确
if(PASS(str))return TRUE;
}catch(CError &e)//异常返回
{
str = "530 Login incorrect for " + string(e.what()) + "." + CRLF;
m_socka.Send(str.c_str(),str.length());
}
return FALSE;
}
//2. 核对用户名 key=user
BOOL CLogin::USER(string &str)
{
char s[256];
strcpy(s,str.c_str());
strupr(s);
if(!theApp.m_map.count(s))//搜索S在map的个数
{
throw CError("username");
}
m_szUser = s;
str = "331 Password required for "+str+"." + CRLF;
m_socka.Send(str.c_str(),str.length());//用户名无误,返回索取密码消息
return TRUE;
}
//3. 核对密码 value.pass
BOOL CLogin::PASS(string &str)
{
if(theApp.m_map[m_szUser].szPass != str)
{
throw CError("password");
}
m_bLogin = TRUE;
m_szPass = str;
m_szPath = theApp.m_map[m_szUser].szPath;//密码无误,获取可访目录
str = "230 User "+m_szUser +" logged in , proceed." +CRLF;
m_socka.Send(str.c_str(),str.length());
return TRUE;
}
——核心end