#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