📄 serverdlg.cpp
字号:
/********************************************************************/
/* */
/* SERVERDLG.CPP */
/* */
/* This class is a part of the Mini ASP Web Server */
/* */
/* Programmed by Pablo van der Meer */
/* This code is stolen from: http://www.pablovandermeer.nl */
/* */
/* Last updated: July 4, 2003 */
/* */
/********************************************************************/
#include "stdafx.h"
#include "Server.h"
#include "ServerDlg.h"
#include "SettingsDlg.h"
#include "AboutDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static UINT auIDStatusBar[] =
{
ID_SEPARATOR,
ID_INDICATOR_TIME
};
CServerDlg::CServerDlg(CWnd* pParent /*=NULL*/)
: CDialog(CServerDlg::IDD, pParent), m_nOpenConnections(0)
{
//{{AFX_DATA_INIT(CServerDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_bRunning = FALSE;
m_bInitialized = FALSE;
}
void CServerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CServerDlg)
DDX_Control(pDX, IDC_TRACELIST, m_TraceList);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CServerDlg, CDialog)
//{{AFX_MSG_MAP(CServerDlg)
ON_COMMAND(ID_SERVER_START, OnServerStart)
ON_COMMAND(ID_SERVER_STOP, OnServerStop)
ON_COMMAND(ID_SERVER_EXIT, OnServerExit)
ON_WM_INITMENU()
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_ABOUT, OnAbout)
ON_BN_CLICKED(IDC_START, OnStart)
ON_BN_CLICKED(IDC_STOP, OnStop)
ON_WM_SIZE()
ON_COMMAND(IDC_SETTINGS, OnSettings)
ON_WM_SYSCOMMAND()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_THREADSTART, OnThreadStart)
ON_MESSAGE(WM_THREADCLOSE, OnThreadClose)
ON_MESSAGE(WM_ADDTRACELINE, OnAddTraceLine)
END_MESSAGE_MAP()
/********************************************************************/
/* */
/* Function name : OnInitDialog */
/* Description : Called by the framework in response to the */
/* WM_INITDIALOG message. */
/* */
/********************************************************************/
BOOL CServerDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set big icon
SetIcon(m_hIcon, TRUE);
// Set small icon
SetIcon(m_hIcon, FALSE);
// Add toolbar/statusbar to the dialog
if (!CreateBars())
{
// fail to create the toolbar
return FALSE;
}
m_TraceList.InsertColumn(0, "Thread ID");
m_TraceList.InsertColumn(1, "Message");
AutoSizeColumns(&m_TraceList);
DWORD dwStyle = m_TraceList.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;
m_TraceList.SetExtendedStyle(dwStyle);
// Load resource and set it as the listview background
TCHAR szModuleName[_MAX_PATH];
::GetModuleFileName(AfxGetInstanceHandle(), szModuleName, _MAX_PATH);
CString strRes;
strRes.Format(_T("res://%s/#2/#%u"), szModuleName, IDB_BACKGROUND);
LVBKIMAGE bki;
bki.ulFlags = LVBKIF_STYLE_NORMAL | LVBKIF_SOURCE_URL;
bki.pszImage = strRes.GetBuffer(strRes.GetLength());
bki.cchImageMax = strRes.GetLength();
bki.xOffsetPercent = 50;
bki.yOffsetPercent = 45;
m_TraceList.SetBkImage(&bki);
m_TraceList.SetTextBkColor(CLR_NONE);
strRes.ReleaseBuffer();
m_wndToolBar.GetToolBarCtrl().EnableButton(IDC_START, !m_bRunning);
m_wndToolBar.GetToolBarCtrl().EnableButton(IDC_STOP, m_bRunning);
m_wndStatusBar.SetPaneText(0, "Web Server is offline", TRUE);
m_strWebPages = AfxGetApp()->GetProfileString("Settings", "WebPages", "C:\\webpages");
m_strDefaultPage = AfxGetApp()->GetProfileString("Settings", "DefaultPage", "index.html");
m_bAutoStart = AfxGetApp()->GetProfileInt("Settings", "AutoStart", 1);
m_nPort = AfxGetApp()->GetProfileInt("Settings", "Port", 80);
// start automatically ?
if (m_bAutoStart)
PostMessage(WM_COMMAND, IDC_START);
m_bInitialized = TRUE;
return TRUE;
}
/********************************************************************/
/* */
/* Function name : OnThreadStart */
/* Description : Client has connected */
/* */
/********************************************************************/
LRESULT CServerDlg::OnThreadStart(WPARAM wParam, LPARAM lParam)
{
m_nOpenConnections++;
CString strText;
strText.Format("Mini ASP Web Server [%d connections]", m_nOpenConnections);
SetWindowText(strText);
LPSTR lpszPeerName = (LPSTR)wParam;
AddTraceLine((DWORD)lParam, "Client connected from %s", lpszPeerName);
delete[] lpszPeerName;
return 0;
}
/********************************************************************/
/* */
/* Function name : OnThreadClose */
/* Description : Client has disconnected */
/* */
/********************************************************************/
LRESULT CServerDlg::OnThreadClose(WPARAM wParam, LPARAM lParam)
{
m_nOpenConnections--;
CString strText;
strText.Format("Mini ASP Web Server [%d connections]", m_nOpenConnections);
SetWindowText(strText);
LPSTR lpszPeerName = (LPSTR)wParam;
AddTraceLine((DWORD)lParam, "Client disconnected from %s", lpszPeerName);
delete[] lpszPeerName;
return 0;
}
/********************************************************************/
/* */
/* Function name : OnAddTraceLine */
/* Description : Trace line posted from other thread */
/* */
/********************************************************************/
LRESULT CServerDlg::OnAddTraceLine(WPARAM wParam, LPARAM lParam)
{
LPSTR lpszData = (LPSTR)wParam;
// prevent crashing the system...
CString strStatusFix = lpszData;
strStatusFix.Replace("%", "%%");
AddTraceLine(lParam, strStatusFix);
delete[] lpszData;
return 0;
}
/********************************************************************/
/* */
/* Function name : OnServerStart */
/* Description : Start Web server */
/* */
/********************************************************************/
void CServerDlg::OnServerStart()
{
if (m_bRunning)
return;
// created the listen socket
if (m_ListenSocket.Create(m_nPort))
{
// start listening
if (m_ListenSocket.Listen())
{
m_ListenSocket.m_pWndDlg = this;
m_bRunning = TRUE;
AddTraceLine(AfxGetThread()->m_nThreadID, "Web Server started on port %d.", m_nPort);
m_wndToolBar.GetToolBarCtrl().EnableButton(IDC_START, !m_bRunning);
m_wndToolBar.GetToolBarCtrl().EnableButton(IDC_STOP, m_bRunning);
m_wndStatusBar.SetPaneText(0, "Web Server is online", TRUE);
return;
}
}
AddTraceLine(AfxGetThread()->m_nThreadID, "Web Server failed to listen on port %d.", m_nPort);
}
/********************************************************************/
/* */
/* Function name : OnServerStop */
/* Description : Stop Web server */
/* */
/********************************************************************/
void CServerDlg::OnServerStop()
{
if (!m_bRunning)
return;
m_bRunning = FALSE;
m_wndToolBar.GetToolBarCtrl().EnableButton(IDC_START, !m_bRunning);
m_wndToolBar.GetToolBarCtrl().EnableButton(IDC_STOP, m_bRunning);
m_wndStatusBar.SetPaneText(0, "Web Server is offline", TRUE);
m_ListenSocket.Close();
CClientThread* pThread = NULL;
// close all running threads
do
{
m_CriticalSection.Lock();
POSITION pos = m_ThreadList.GetHeadPosition();
if (pos != NULL)
{
pThread = (CClientThread *)m_ThreadList.GetAt(pos);
m_CriticalSection.Unlock();
// save thread members
int nThreadID = pThread->m_nThreadID;
HANDLE hThread = pThread->m_hThread;
AddTraceLine(nThreadID, "Shutting down thread...");
// tell thread to stop
pThread->SetThreadPriority(THREAD_PRIORITY_HIGHEST);
pThread->PostThreadMessage(WM_QUIT,0,0);
// wait for thread to end, while keeping the messages pumping (max 5 seconds)
if (WaitWithMessageLoop(hThread, 5000) == FALSE)
{
// thread doesn't want to stopped
AddTraceLine(nThreadID, "Problem while killing thread.");
// don't try again, so remove
m_CriticalSection.Lock();
POSITION rmPos = m_ThreadList.Find(pThread);
if (rmPos != NULL)
m_ThreadList.RemoveAt(rmPos);
m_CriticalSection.Unlock();
}
else
{
AddTraceLine(nThreadID, "Thread successfully stopped.");
}
}
else
{
m_CriticalSection.Unlock();
pThread = NULL;
}
}
while (pThread != NULL);
AddTraceLine(AfxGetThread()->m_nThreadID, "Web Server stopped.");
}
/********************************************************************/
/* */
/* Function name : OnServerExit */
/* Description : Client has disconnected */
/* */
/********************************************************************/
void CServerDlg::OnServerExit()
{
CDialog::OnOK();
}
/********************************************************************/
/* */
/* Function name : AddTraceLine */
/* Description : Web status change. */
/* */
/********************************************************************/
void CServerDlg::AddTraceLine(DWORD dwThreadID, LPCTSTR pstrFormat, ...)
{
try
{
CString str;
// format and write the data we were given
va_list args;
va_start(args, pstrFormat);
str.FormatV(pstrFormat, args);
CString strThreadID;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -