166 lines
4.4 KiB
C++
166 lines
4.4 KiB
C++
#include "helper.h"
|
|
#include "TcpServer.h"
|
|
|
|
class CListenerImpl : public CTcpServerListener
|
|
{
|
|
|
|
public:
|
|
virtual EnHandleResult OnPrepareListen(ITcpServer* pSender, SOCKET soListen) override
|
|
{
|
|
TCHAR szAddress[100];
|
|
int iAddressLen = sizeof(szAddress) / sizeof(TCHAR);
|
|
USHORT usPort;
|
|
|
|
pSender->GetListenAddress(szAddress, iAddressLen, usPort);
|
|
::PostOnPrepareListen(szAddress, usPort);
|
|
|
|
return HR_OK;
|
|
}
|
|
|
|
virtual EnHandleResult OnAccept(ITcpServer* pSender, CONNID dwConnID, UINT_PTR soClient) override
|
|
{
|
|
BOOL bPass = TRUE;
|
|
TCHAR szAddress[100];
|
|
int iAddressLen = sizeof(szAddress) / sizeof(TCHAR);
|
|
USHORT usPort;
|
|
|
|
pSender->GetRemoteAddress(dwConnID, szAddress, iAddressLen, usPort);
|
|
|
|
if(!g_app_arg.reject_addr.IsEmpty())
|
|
{
|
|
if(g_app_arg.reject_addr.CompareNoCase(szAddress) == 0)
|
|
bPass = FALSE;
|
|
}
|
|
|
|
::PostOnAccept(dwConnID, szAddress, usPort, bPass);
|
|
|
|
return bPass ? HR_OK : HR_ERROR;
|
|
}
|
|
|
|
virtual EnHandleResult OnHandShake(ITcpServer* pSender, CONNID dwConnID) override
|
|
{
|
|
return HR_OK;
|
|
}
|
|
|
|
virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override
|
|
{
|
|
::PostOnReceive(dwConnID, pData, iLength);
|
|
|
|
if(pSender->Send(dwConnID, pData, iLength))
|
|
return HR_OK;
|
|
|
|
return HR_ERROR;
|
|
}
|
|
|
|
virtual EnHandleResult OnSend(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override
|
|
{
|
|
::PostOnSend(dwConnID, pData, iLength);
|
|
return HR_OK;
|
|
}
|
|
|
|
virtual EnHandleResult OnClose(ITcpServer* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode) override
|
|
{
|
|
iErrorCode == SE_OK ? ::PostOnClose(dwConnID) :
|
|
::PostOnError(dwConnID, enOperation, iErrorCode);
|
|
|
|
return HR_OK;
|
|
}
|
|
|
|
virtual EnHandleResult OnShutdown(ITcpServer* pSender) override
|
|
{
|
|
::PostOnShutdown();
|
|
return HR_OK;
|
|
}
|
|
|
|
};
|
|
|
|
CListenerImpl s_listener;
|
|
CTcpServer s_server(&s_listener);
|
|
|
|
void OnCmdStart(CCommandParser* pParser)
|
|
{
|
|
if(s_server.Start(g_app_arg.bind_addr, g_app_arg.port))
|
|
::LogServerStart(g_app_arg.bind_addr, g_app_arg.port);
|
|
else
|
|
::LogServerStartFail(s_server.GetLastError(), s_server.GetLastErrorDesc());
|
|
}
|
|
|
|
void OnCmdStop(CCommandParser* pParser)
|
|
{
|
|
if(s_server.Stop())
|
|
::LogServerStop();
|
|
else
|
|
::LogServerStopFail(s_server.GetLastError(), s_server.GetLastErrorDesc());
|
|
}
|
|
|
|
void OnCmdStatus(CCommandParser* pParser)
|
|
{
|
|
pParser->PrintStatus(s_server.GetState());
|
|
}
|
|
|
|
void OnCmdSend(CCommandParser* pParser)
|
|
{
|
|
if(s_server.Send(pParser->m_dwConnID, (LPBYTE)(LPCTSTR)pParser->m_strMessage, pParser->m_strMessage.GetLength()))
|
|
::LogSend(pParser->m_dwConnID, pParser->m_strMessage);
|
|
else
|
|
::LogSendFail(pParser->m_dwConnID, ::GetLastError(), ::GetLastErrorStr());
|
|
}
|
|
|
|
void OnCmdPause(CCommandParser* pParser)
|
|
{
|
|
if(s_server.PauseReceive(pParser->m_dwConnID, pParser->m_bFlag))
|
|
::LogPause(pParser->m_dwConnID, pParser->m_bFlag);
|
|
else
|
|
::LogPauseFail(pParser->m_dwConnID, pParser->m_bFlag);
|
|
}
|
|
|
|
void OnCmdKick(CCommandParser* pParser)
|
|
{
|
|
if(s_server.Disconnect(pParser->m_dwConnID, pParser->m_bFlag))
|
|
::LogDisconnect2(pParser->m_dwConnID, pParser->m_bFlag);
|
|
else
|
|
::LogDisconnectFail2(pParser->m_dwConnID, pParser->m_bFlag);
|
|
}
|
|
|
|
void OnCmdKickLong(CCommandParser* pParser)
|
|
{
|
|
if(s_server.DisconnectLongConnections(pParser->m_dwSeconds * 1000, pParser->m_bFlag))
|
|
::LogDisconnectLong(pParser->m_dwSeconds, pParser->m_bFlag);
|
|
else
|
|
::LogDisconnectFailLong(pParser->m_dwSeconds, pParser->m_bFlag);
|
|
}
|
|
|
|
void OnCmdKickSilence(CCommandParser* pParser)
|
|
{
|
|
if(s_server.DisconnectSilenceConnections(pParser->m_dwSeconds * 1000, pParser->m_bFlag))
|
|
::LogDisconnectLong(pParser->m_dwSeconds, pParser->m_bFlag);
|
|
else
|
|
::LogDisconnectFailLong(pParser->m_dwSeconds, pParser->m_bFlag);
|
|
}
|
|
|
|
int main(int argc, char* const argv[])
|
|
{
|
|
CTermAttrInitializer term_attr;
|
|
CAppSignalHandler s_signal_handler({SIGTTOU, SIGINT});
|
|
|
|
g_app_arg.ParseArgs(argc, argv);
|
|
|
|
s_server.SetKeepAliveTime(g_app_arg.keep_alive ? TCP_KEEPALIVE_TIME : 0);
|
|
|
|
CCommandParser::CMD_FUNC fnCmds[CCommandParser::CT_MAX] = {0};
|
|
|
|
fnCmds[CCommandParser::CT_START] = OnCmdStart;
|
|
fnCmds[CCommandParser::CT_STOP] = OnCmdStop;
|
|
fnCmds[CCommandParser::CT_STATUS] = OnCmdStatus;
|
|
fnCmds[CCommandParser::CT_SEND] = OnCmdSend;
|
|
fnCmds[CCommandParser::CT_PAUSE] = OnCmdPause;
|
|
fnCmds[CCommandParser::CT_KICK] = OnCmdKick;
|
|
fnCmds[CCommandParser::CT_KICK_L] = OnCmdKickLong;
|
|
fnCmds[CCommandParser::CT_KICK_S] = OnCmdKickSilence;
|
|
|
|
CCommandParser s_cmd_parser(CCommandParser::AT_SERVER, fnCmds);
|
|
s_cmd_parser.Run();
|
|
|
|
return EXIT_CODE_OK;
|
|
}
|