#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