117 lines
3.0 KiB
C++
117 lines
3.0 KiB
C++
#undef _BROTLI_SUPPORT
|
|
|
|
#include "helper.h"
|
|
#include "TcpClient.h"
|
|
|
|
class CListenerImpl : public CTcpClientListener
|
|
{
|
|
|
|
public:
|
|
virtual EnHandleResult OnPrepareConnect(ITcpClient* pSender, CONNID dwConnID, SOCKET socket) override
|
|
{
|
|
return HR_OK;
|
|
}
|
|
|
|
virtual EnHandleResult OnConnect(ITcpClient* pSender, CONNID dwConnID) override
|
|
{
|
|
TCHAR szAddress[100];
|
|
int iAddressLen = sizeof(szAddress) / sizeof(TCHAR);
|
|
USHORT usPort;
|
|
|
|
pSender->GetRemoteHost(szAddress, iAddressLen, usPort);
|
|
|
|
::PostOnConnect2(dwConnID, szAddress, usPort);
|
|
|
|
return HR_OK;
|
|
}
|
|
|
|
virtual EnHandleResult OnHandShake(ITcpClient* pSender, CONNID dwConnID) override
|
|
{
|
|
return HR_OK;
|
|
}
|
|
|
|
virtual EnHandleResult OnReceive(ITcpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override
|
|
{
|
|
::PostOnReceive(dwConnID, pData, iLength);
|
|
return HR_OK;
|
|
}
|
|
|
|
virtual EnHandleResult OnSend(ITcpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override
|
|
{
|
|
::PostOnSend(dwConnID, pData, iLength);
|
|
return HR_OK;
|
|
}
|
|
|
|
virtual EnHandleResult OnClose(ITcpClient* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode) override
|
|
{
|
|
iErrorCode == SE_OK ? ::PostOnClose(dwConnID) :
|
|
::PostOnError(dwConnID, enOperation, iErrorCode);
|
|
|
|
return HR_OK;
|
|
}
|
|
|
|
};
|
|
|
|
CListenerImpl s_listener;
|
|
CTcpClient s_client(&s_listener);
|
|
|
|
void OnCmdStart(CCommandParser* pParser)
|
|
{
|
|
if(s_client.Start(g_app_arg.remote_addr, g_app_arg.port, g_app_arg.async, g_app_arg.bind_addr))
|
|
::LogClientStart(g_app_arg.remote_addr, g_app_arg.port);
|
|
else
|
|
::LogClientStartFail(s_client.GetLastError(), s_client.GetLastErrorDesc());
|
|
}
|
|
|
|
void OnCmdStop(CCommandParser* pParser)
|
|
{
|
|
if(s_client.Stop())
|
|
::LogClientStop();
|
|
else
|
|
::LogClientStopFail(s_client.GetLastError(), s_client.GetLastErrorDesc());
|
|
}
|
|
|
|
void OnCmdStatus(CCommandParser* pParser)
|
|
{
|
|
pParser->PrintStatus(s_client.GetState());
|
|
}
|
|
|
|
void OnCmdSend(CCommandParser* pParser)
|
|
{
|
|
if(s_client.Send((LPBYTE)(LPCTSTR)pParser->m_strMessage, pParser->m_strMessage.GetLength()))
|
|
::LogSend(s_client.GetConnectionID(), pParser->m_strMessage);
|
|
else
|
|
::LogSendFail(s_client.GetConnectionID(), ::GetLastError(), ::GetLastErrorStr());
|
|
}
|
|
|
|
void OnCmdPause(CCommandParser* pParser)
|
|
{
|
|
if(s_client.PauseReceive(pParser->m_bFlag))
|
|
::LogPause(s_client.GetConnectionID(), pParser->m_bFlag);
|
|
else
|
|
::LogPauseFail(s_client.GetConnectionID(), 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_client.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;
|
|
|
|
CCommandParser s_cmd_parser(CCommandParser::AT_CLIENT, fnCmds);
|
|
s_cmd_parser.Run();
|
|
|
|
return EXIT_CODE_OK;
|
|
}
|