348 lines
7.3 KiB
C++
348 lines
7.3 KiB
C++
#include "stdafx.h"
|
|
#include "WebServer.h"
|
|
#include "WebServerDlg.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#endif
|
|
|
|
#define IDI_RECONNECT_CENTER 10001
|
|
|
|
//菜单命令
|
|
#define IDM_CLEAR_ALL (WM_USER+201) //删除信息
|
|
#define IDM_SELECT_ALL (WM_USER+202) //全部选择
|
|
#define IDM_COPY_STRING (WM_USER+203) //拷贝字符
|
|
#define IDM_SAVE_STRING (WM_USER+205) //保存信息
|
|
#define IDM_DELETE_STRING (WM_USER+204) //删除字符
|
|
|
|
CString CWebServerDlg::g_strVerifyKey = "";
|
|
|
|
CWebServerDlg::CWebServerDlg() : CDialog(IDD_SERV_DIALOG), m_nOpenConnections(0)
|
|
{
|
|
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
|
|
m_bRunning = FALSE;
|
|
m_bInitialized = FALSE;
|
|
}
|
|
|
|
CWebServerDlg::~CWebServerDlg()
|
|
{
|
|
//KillTimer(IDI_RECONNECT_CENTER);
|
|
|
|
//关闭连接
|
|
if (m_ClientSocket.GetInterface()!=NULL)
|
|
{
|
|
m_ClientSocket->CloseSocket();
|
|
}
|
|
}
|
|
|
|
void CWebServerDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
|
|
DDX_Control(pDX, IDC_SERVICE_EVENT, m_TraceServiceControl);
|
|
}
|
|
|
|
//接口查询
|
|
VOID * CWebServerDlg::QueryInterface(const IID & Guid, DWORD dwQueryVer)
|
|
{
|
|
QUERYINTERFACE(IClientSocketSink, Guid, dwQueryVer);
|
|
QUERYINTERFACE_IUNKNOWNEX(IClientSocketSink, Guid, dwQueryVer);
|
|
return NULL;
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CWebServerDlg, CDialog)
|
|
ON_COMMAND(ID_SERVER_START, OnServerStart)
|
|
ON_COMMAND(ID_SERVER_STOP, OnServerStop)
|
|
ON_COMMAND(ID_SERVER_EXIT, OnServerExit)
|
|
ON_WM_CLOSE()
|
|
|
|
ON_BN_CLICKED(IDC_START_SERVICE, OnStart)
|
|
ON_BN_CLICKED(IDC_STOP_SERVICE, OnStop)
|
|
ON_WM_TIMER()
|
|
END_MESSAGE_MAP()
|
|
|
|
BOOL CWebServerDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
//设置标题
|
|
SetWindowText(TEXT("网页网关服务器 -- [ 停止 ]"));
|
|
|
|
// Set big icon
|
|
SetIcon(m_hIcon, TRUE);
|
|
// Set small icon
|
|
SetIcon(m_hIcon, FALSE);
|
|
|
|
//获取目录
|
|
TCHAR szPath[MAX_PATH]=TEXT("");
|
|
GetCurrentDirectory(sizeof(szPath),szPath);
|
|
|
|
//读取配置
|
|
TCHAR szFileName[MAX_PATH] = {0};
|
|
_tprintf_s(szFileName,sizeof(szFileName),TEXT("%s\\ServerParameter.ini"), szPath);
|
|
|
|
CString strTag = TEXT("WebGate");
|
|
//是否自动启动
|
|
m_bAutoStart = (GetPrivateProfileInt(strTag, TEXT("AutoStart"), 0, szFileName)>0);
|
|
//服务端口
|
|
m_nPort = GetPrivateProfileInt(strTag, TEXT("ServicePort"), PORT_WEB_GATE, szFileName);
|
|
//中心服务器地址
|
|
TCHAR szData[128]={0};
|
|
::GetPrivateProfileString(strTag, TEXT("CorrespondAddr"), TEXT("127.0.0.1"), szData, sizeof(szData), szFileName);
|
|
|
|
m_strCenterAddr = szData;
|
|
//中心服务器端口
|
|
m_nCenterPort = GetPrivateProfileInt(strTag, TEXT("CorrespondPort"), PORT_CENTER, szFileName);
|
|
|
|
ZeroMemory(szData, sizeof(szData));
|
|
::GetPrivateProfileString(strTag, TEXT("VerifyKey"), TEXT("b5f7cd2f3e93"), szData, sizeof(szData), szFileName);
|
|
|
|
g_strVerifyKey = szData;
|
|
|
|
if ( !m_bAutoStart )
|
|
{
|
|
LPCTSTR pszCmdLine=AfxGetApp()->m_lpCmdLine;
|
|
if (pszCmdLine[0]!=0)
|
|
{
|
|
m_bAutoStart=TRUE;
|
|
}
|
|
}
|
|
|
|
if (m_bAutoStart)
|
|
{
|
|
PostMessage(WM_COMMAND, ID_SERVER_START);
|
|
}
|
|
|
|
//创建网络组件
|
|
if (!m_ClientSocket.CreateInstance() )
|
|
{
|
|
ASSERT(FALSE);
|
|
AddTraceLine(m_ClientSocket.m_szDescribe);
|
|
|
|
return false;
|
|
}
|
|
|
|
IUnknownEx * pIUnknow = QUERY_ME_INTERFACE(IUnknownEx);
|
|
if (!m_ClientSocket->SetTCPSocketSink(pIUnknow)) return false;
|
|
|
|
m_bInitialized = TRUE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CWebServerDlg::OnCancel()
|
|
{
|
|
//询问退出
|
|
if ( m_bRunning )
|
|
{
|
|
CString strMessage=TEXT("服务器正在运行中,确实要退出吗?");
|
|
if (AfxMessageBox(strMessage,MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2)!=IDYES) return;
|
|
}
|
|
|
|
OnServerStop();
|
|
|
|
__super::OnCancel();
|
|
}
|
|
|
|
BOOL CWebServerDlg::OnCommand( WPARAM wParam, LPARAM lParam )
|
|
{
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDC_SERVICE_EVENT:
|
|
{
|
|
if (lParam==WM_RBUTTONUP)
|
|
{
|
|
CMenu menu;
|
|
menu.CreatePopupMenu();
|
|
//建立菜单
|
|
menu.AppendMenu(0, IDM_COPY_STRING,TEXT("复制(&C) Ctrl+C"));
|
|
menu.AppendMenu(0, IDM_SELECT_ALL,TEXT("全选(&A) Ctrl+A"));
|
|
menu.AppendMenu(0, IDM_DELETE_STRING,TEXT("删除(&D)"));
|
|
menu.AppendMenu(0, IDM_CLEAR_ALL,TEXT("清除屏幕"));
|
|
|
|
//获取位置
|
|
CPoint MousePoint;
|
|
GetCursorPos(&MousePoint);
|
|
|
|
menu.TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,MousePoint.x,MousePoint.y,this);
|
|
}
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return __super::OnCommand(wParam,lParam);
|
|
}
|
|
|
|
void CWebServerDlg::OnServerStart()
|
|
{
|
|
if (m_bRunning)
|
|
return;
|
|
|
|
//设置标题
|
|
SetWindowText(TEXT("网页网关服务器 -- [ 初始化 ]"));
|
|
|
|
if ( Start(1000, static_cast<WORD>(m_nPort)) )
|
|
{
|
|
m_bRunning = TRUE;
|
|
|
|
//设置标题
|
|
SetWindowText(TEXT("网页网关服务器 -- [ 运行 ]"));
|
|
|
|
AddTraceLine(_T("网站网关服务启动成功,监听端口号为 %d."), m_nPort);
|
|
|
|
m_ClientSocket->Connect(m_strCenterAddr, static_cast<WORD>(m_nCenterPort));
|
|
|
|
//设置界面
|
|
GetDlgItem(IDC_STOP_SERVICE)->EnableWindow(TRUE);
|
|
GetDlgItem(IDC_START_SERVICE)->EnableWindow(FALSE);
|
|
|
|
return;
|
|
}
|
|
|
|
AddTraceLine(_T("服务启动失败,监听端口号为 %d."), m_nPort);
|
|
|
|
//设置标题
|
|
SetWindowText(TEXT("网页网关服务器 -- [ 停止 ]"));
|
|
}
|
|
|
|
void CWebServerDlg::OnServerStop()
|
|
{
|
|
if (!m_bRunning)
|
|
return;
|
|
|
|
m_bRunning = FALSE;
|
|
m_ClientSocket->CloseSocket();
|
|
|
|
Stop();
|
|
|
|
AddTraceLine(_T("服务停止."));
|
|
|
|
//设置标题
|
|
SetWindowText(TEXT("网页网关服务器 -- [ 停止 ]"));
|
|
|
|
//设置界面
|
|
GetDlgItem(IDC_STOP_SERVICE)->EnableWindow(FALSE);
|
|
GetDlgItem(IDC_START_SERVICE)->EnableWindow(TRUE);
|
|
}
|
|
|
|
void CWebServerDlg::OnServerExit()
|
|
{
|
|
CDialog::OnOK();
|
|
}
|
|
|
|
void CWebServerDlg::AddTraceLine(LPCTSTR pstrFormat, ...)
|
|
{
|
|
try
|
|
{
|
|
CString str;
|
|
|
|
// format and write the data we were given
|
|
va_list args;
|
|
va_start(args, pstrFormat);
|
|
str.FormatV(pstrFormat, args);
|
|
va_end(args);
|
|
|
|
CTraceService::TraceString(str, TraceLevel_Normal);
|
|
}
|
|
catch(CMemoryException *e)
|
|
{
|
|
e->Delete();
|
|
}
|
|
catch(...)
|
|
{
|
|
// catch formating errors ...
|
|
}
|
|
}
|
|
|
|
void CWebServerDlg::OnClose()
|
|
{
|
|
OnServerStop();
|
|
|
|
CDialog::OnCancel();
|
|
}
|
|
|
|
void CWebServerDlg::OnStart()
|
|
{
|
|
OnServerStart();
|
|
}
|
|
|
|
void CWebServerDlg::OnStop()
|
|
{
|
|
OnServerStop();
|
|
}
|
|
|
|
void CWebServerDlg::OnTimer(UINT nIDEvent)
|
|
{
|
|
// TODO: 在此添加消息处理程序代码和/或调用默认值
|
|
if ( nIDEvent == IDI_RECONNECT_CENTER )
|
|
{
|
|
KillTimer(IDI_RECONNECT_CENTER);
|
|
|
|
//重新连接
|
|
if ( m_bRunning && m_ClientSocket->GetSocketStatus()==SOCKET_STATUS_IDLE )
|
|
{
|
|
m_ClientSocket->Connect(m_strCenterAddr, static_cast<WORD>(m_nCenterPort));
|
|
}
|
|
}
|
|
|
|
__super::OnTimer(nIDEvent);
|
|
}
|
|
|
|
//网络关闭消息
|
|
bool CWebServerDlg::OnEventClientSocketShut(WORD wServiceID, BYTE cbShutReason)
|
|
{
|
|
if (cbShutReason!=SHUT_REASON_NORMAL)
|
|
{
|
|
if ((cbShutReason==SHUT_REASON_REMOTE)||(cbShutReason==SHUT_REASON_TIME_OUT))
|
|
{
|
|
AddTraceLine(_T("由于网络问题,您已经与服务器断开连接,请重新连接"));
|
|
}
|
|
else
|
|
{
|
|
AddTraceLine(_T("由于网络数据包处理失败,网络中断了"));
|
|
}
|
|
|
|
//设置定时器重新连接
|
|
if ( m_bRunning )
|
|
{
|
|
SetTimer(IDI_RECONNECT_CENTER, 1000, NULL);
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CWebServerDlg::OnEventClientSocketRead(WORD wServiceID, TCP_Command Command, VOID * pData, WORD wDataSize)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
bool CWebServerDlg::OnEventClientSocketLink(WORD wServiceID, INT nErrorCode)
|
|
{
|
|
if ( nErrorCode != 0)
|
|
{
|
|
//设置定时器重新连接
|
|
if ( m_bRunning )
|
|
{
|
|
SetTimer(IDI_RECONNECT_CENTER, 1000, NULL);
|
|
}
|
|
}
|
|
|
|
if ( m_ClientSocket->GetSocketStatus()==SOCKET_STATUS_CONNECT )
|
|
{
|
|
AddTraceLine(_T("与中心服务器连接成功!"));
|
|
|
|
//CMD_KN_DetectSocket DetectSocket;
|
|
//m_ClientSocket->SendData(MDM_KN_COMMAND,SUB_KN_DETECT_SOCKET,&DetectSocket,sizeof(DetectSocket));
|
|
|
|
CMD_CS_C_RegisterWebGate mReg;
|
|
ZeroMemory(&mReg, sizeof(CMD_CS_C_RegisterWebGate));
|
|
|
|
m_ClientSocket->SendData(MDM_CS_REGISTER, SUB_CS_C_REGISTER_WEBGATE, &mReg, sizeof(mReg));
|
|
|
|
return true;
|
|
}
|
|
|
|
return true;
|
|
}
|