www.pudn.com > IOCPTest.rar > IOCP_ServerView.cpp


// IOCP_ServerView.cpp : implementation of the CIOCP_ServerView class 
// 
 
#include "stdafx.h" 
#include "IOCP_Server.h" 
 
#include "IOCP_ServerDoc.h" 
#include "IOCP_ServerView.h" 
#include "MainFrm.h" 
#include "IOCPServer.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CIOCP_ServerView 
 
IMPLEMENT_DYNCREATE(CIOCP_ServerView, CFormView) 
 
BEGIN_MESSAGE_MAP(CIOCP_ServerView, CFormView) 
	//{{AFX_MSG_MAP(CIOCP_ServerView) 
	ON_WM_SIZE() 
	ON_WM_TIMER() 
	ON_BN_CLICKED(IDC_CHECK1, OnCheck1) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
 
void CIOCP_ServerView::DoDataExchange(CDataExchange* pDX) 
{ 
	CFormView::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CIOCP_ServerView) 
	DDX_Control(pDX, IDC_LIST, m_list); 
	DDX_Text(pDX, IDC_BCNT, m_sBusy); 
	DDX_Text(pDX, IDC_WCNT, m_sWorkers); 
	//}}AFX_DATA_MAP 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CIOCP_ServerView construction/destruction 
 
CIOCP_ServerView::CIOCP_ServerView() : CFormView(CIOCP_ServerView::IDD) 
{ 
	//{{AFX_DATA_INIT(CIOCP_ServerView) 
	m_sActive = _T(""); 
	m_sBusy = _T(""); 
	m_sWorkers = _T(""); 
	//}}AFX_DATA_INIT 
	// TODO: add construction code here 
 
} 
 
CIOCP_ServerView::~CIOCP_ServerView() 
{ 
} 
 
BOOL CIOCP_ServerView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CFormView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CIOCP_ServerView drawing 
 
void CIOCP_ServerView::OnDraw(CDC* pDC) 
{ 
	CIOCP_ServerDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	// TODO: add draw code for native data here 
} 
 
void CIOCP_ServerView::OnInitialUpdate() 
{ 
 
	CFormView::OnInitialUpdate(); 
	GetParentFrame()->RecalcLayout(); 
	ResizeParentToFit(); 
 
	m_list.InsertColumn(0, "Client", LVCFMT_LEFT, 110); 
	m_list.InsertColumn(1, "Msgs Received", LVCFMT_LEFT, 110); 
	m_list.InsertColumn(2, "Msgs Sent", LVCFMT_LEFT, 110); 
 
	SetTimer(IDT_TIMER, 1000, NULL); 
 
 
 
 
	// TODO: You may populate your ListView with items by directly accessing 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CIOCP_ServerView diagnostics 
 
#ifdef _DEBUG 
void CIOCP_ServerView::AssertValid() const 
{ 
	CFormView::AssertValid(); 
} 
 
void CIOCP_ServerView::Dump(CDumpContext& dc) const 
{ 
	CFormView::Dump(dc); 
} 
 
CIOCP_ServerDoc* CIOCP_ServerView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CIOCP_ServerDoc))); 
	return (CIOCP_ServerDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
 
 
void CIOCP_ServerView::AddToList(ClientContext* pContext) 
{ 
	int nCnt = m_list.GetItemCount(); 
 
	sockaddr_in  sockAddr; 
	memset(&sockAddr, 0, sizeof(sockAddr)); 
 
	int nSockAddrLen = sizeof(sockAddr); 
	 
	BOOL bResult = getpeername(pContext->m_Socket,(SOCKADDR*)&sockAddr, &nSockAddrLen); 
	 
	CString strHost =  inet_ntoa(sockAddr.sin_addr); 
 
 
	int i = m_list.InsertItem(nCnt, strHost, 0); 
	m_list.SetItemData(nCnt, (DWORD) pContext); 
 
} 
 
void CIOCP_ServerView::OnSize(UINT nType, int cx, int cy)  
{ 
	CFormView::OnSize(nType, cx, cy); 
	 
	 
} 
 
 
void CIOCP_ServerView::RemoveFromList(ClientContext* pContext) 
{ 
	int nCnt = m_list.GetItemCount(); 
	for (int i=0; i < nCnt; i++) 
	{ 
		ClientContext* pItemContext = (ClientContext*) m_list.GetItemData(i); 
		if (pItemContext == pContext) 
		{ 
			m_list.DeleteItem(i); 
			break; 
		}		 
	} 
} 
 
void CIOCP_ServerView::OnTimer(UINT nIDEvent)  
{ 
	int nCnt = m_list.GetItemCount(); 
	for (int i=0; i < nCnt; i++) 
	{ 
		ClientContext* pItemContext = (ClientContext*) m_list.GetItemData(i); 
		if (pItemContext) 
		{ 
 
			CString sNum; 
 
			sNum.Format("%d",pItemContext->m_nMsgIn); 
			m_list.SetItemText(i,1, sNum); 
 
			sNum.Format("%d",pItemContext->m_nMsgOut); 
			m_list.SetItemText(i,2, sNum); 
		} 
 
	} 
 
 
	// This is purely for testing purposes 
	CMainFrame* pFrame = static_cast(AfxGetMainWnd()); 
		 
	CIOCPServer* pServer = &pFrame->m_iocpServer; 
 
	m_sWorkers.Format("%d",pServer->m_nCurrentThreads); 
	m_sBusy.Format("%d",pServer->m_nBusyThreads); 
 
	UpdateData(FALSE); 
	 
 
	CFormView::OnTimer(nIDEvent); 
} 
 
void CIOCP_ServerView::OnCheck1()  
{ 
	// This is purely for testing purposes 
	CMainFrame* pFrame = static_cast(AfxGetMainWnd()); 
		 
	CIOCPServer* pServer = &pFrame->m_iocpServer; 
	pServer->SetEchoMode(); 
	 
}