⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serverdlg.cpp

📁 vc++6.0开发网络典型应用实例导航 1. 本光盘提供了本书中所有的实例源程序文件。 2. 附录文件夹下是Winsock 函数参考以及错误码列表
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/********************************************************************/
/*																	*/
/*  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 + -