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

📄 znetserverdlg.cpp

📁 iocp vc例子,自己是学DELPHI
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			strFile2 = strFileName;
			break;
		case 2:
			strFile3 = strFileName;
			break;
		}
		nIndex ++;
		strFileList = strFileList.Mid(nPos+1);
		nPos = strFileList.Find(strSeperator);
	}

	CString strFileName, strTest1, strTest2;
	CIocpPacketHeader pkHeader;
	switch (l)
	{
	case 1:
		pkHeader.m_nCmd = 100;
		pkHeader.m_wParam = 200;
		pkHeader.m_lParam = 300;
		strTest1=_T("工人");
		strTest2=_T("www");
		strFileName = strFile1;
		break;
	case 2:
		pkHeader.m_nCmd = 400;
		pkHeader.m_wParam = 500;
		pkHeader.m_lParam = 600;
		strTest1=_T("以在");
		strTest2=_T("rrr");
		strFileName = strFile2;
		break;
	case 0:
		pkHeader.m_nCmd = 700;
		pkHeader.m_wParam = 800;
		pkHeader.m_lParam = 900;
		strTest1=_T("地有");
		strTest2=_T("yyy");
		strFileName = strFile3;
		break;
	}
	
	CIocpPacket pk;
	pk.SetPacketHeader(pkHeader);
	CArchive ar(&pk.GetPacketMem(), CArchive::store);
	ar << strTest1;
	ar << strTest2;
	ar.Close();
	pk.AddPacketFile(strFileName);
	int nErr=pDlg->m_IocpMngr.SendData(pDlg->m_nSocket, &pk);
	if (!NOERROROCCUR(nErr)) Logging3(nErr, DOMAIN_NAME, CLASS_NAME_ZNETSERVERDLG);
	
	LoggingX(_T("%d Thread Stop..."), l);

	return 0;
}

void CZNetServerDlg::OnButton5() 
{
	// TODO: Add your control notification handler code here
	//启动3个线程发送数据包
	UpdateData();
	int nIndex=m_lcClient.GetNextItem(-1, LVNI_SELECTED);
	if (nIndex<0) return;
	m_nSocket = m_lcClient.GetItemData(nIndex);
	
	int nNumberOfThread=3;
	DWORD dwThreadId=0;
	for(int i=0; i<nNumberOfThread;i++)
	{
		HANDLE hThread=CreateThread(NULL, 0, CZNetServerDlg::SendThread, 
			(LPVOID)this, THREAD_PRIORITY_NORMAL, &dwThreadId);
		if (hThread!=NULL) CloseHandle(hThread);
	}
	
}

void CZNetServerDlg::OnButton6() 
{
	// TODO: Add your control notification handler code here
	//创建线程来发送断开命令,否则会与主窗口线程冲突,导致死锁
	UpdateData();
	int nIndex=m_lcClient.GetNextItem(-1, LVNI_SELECTED);
	if (nIndex<0) return;
	
	m_nSocket = m_lcClient.GetItemData(nIndex);
	
	int nNumberOfThread=1;
	DWORD dwThreadId=0;
	for(int i=0; i<nNumberOfThread;i++)
	{
		HANDLE hThread=CreateThread(NULL, 0, CZNetServerDlg::DisconnectThread, 
			(LPVOID)this, THREAD_PRIORITY_NORMAL, &dwThreadId);
		if (hThread!=NULL) CloseHandle(hThread);
	}	
}

void CZNetServerDlg::OnButton7() 
{
	// TODO: Add your control notification handler code here
	//连接服务器,仅客户端使用
	UpdateData();

	m_IocpMngr.Connect(m_strServer, m_nServerPort);
}

void CZNetServerDlg::ProcessNewConnection(CIocpContext* pContext)
{
	if (pContext==NULL) return;
	
	LoggingX(_T("Enter ProcessNewConnection"));
	for (int i=0; i<m_lcClient.GetItemCount(); i++)
	{
		int nSocket=m_lcClient.GetItemData(i);
		if ((SOCKET)nSocket==pContext->m_soContext) break;
	}
	if (i>=m_lcClient.GetItemCount())
	{
		CString strAddr=inet_ntoa(pContext->m_saRemote.sin_addr);
		CString strSocket;
		strSocket.Format(_T("%d"), pContext->m_soContext);
		int nIndex=m_lcClient.InsertItem(i, _T(""));
		m_lcClient.SetItemText(nIndex, 0, strAddr);
		m_lcClient.SetItemText(nIndex, 1, strSocket);
		m_lcClient.SetItemText(nIndex, 2, _T("active"));
		m_lcClient.SetItemData(nIndex, pContext->m_soContext);
	}
	else
	{
		m_lcClient.SetItemText(i, 2, _T("active"));
	}
	LoggingX(_T("Leave ProcessNewConnection"));
}

void CZNetServerDlg::ProcessDisConnection(SOCKET soSocket)
{	
	if (soSocket==INVALID_SOCKET) return;

	LoggingX(_T("Enter ProcessDisConnection"));
	for (int i=0; i<m_lcClient.GetItemCount(); i++)
	{
		int nSocket=m_lcClient.GetItemData(i);
		if ((SOCKET)nSocket==soSocket)
		{			
			m_lcClient.SetItemText(i, 2, _T("dead"));
			break;
		}
	}
	m_dlgProgress.ProcessPacketCancel(soSocket);
	LoggingX(_T("Leave ProcessDisConnection"));
}

void CZNetServerDlg::OnButton8() 
{
	// TODO: Add your control notification handler code here
	//创建线程来发送同步命令,否则会与主窗口线程冲突,导致死锁
	UpdateData();
	int nIndex=m_lcClient.GetNextItem(-1, LVNI_SELECTED);
	if (nIndex<0) return;

	m_nSocket = m_lcClient.GetItemData(nIndex);
	
	int nNumberOfThread=1;
	DWORD dwThreadId=0;
	for(int i=0; i<nNumberOfThread;i++)
	{
		HANDLE hThread=CreateThread(NULL, 0, CZNetServerDlg::SyncSendThread, 
			(LPVOID)this, THREAD_PRIORITY_NORMAL, &dwThreadId);
		if (hThread!=NULL) CloseHandle(hThread);
	}
}

void CZNetServerDlg::OnButton9() 
{
	// TODO: Add your control notification handler code here
	//显示数据包进度窗口
	if (m_dlgProgress.GetSafeHwnd())
	{
		CString strText;
		GetWindowText(strText);
		m_dlgProgress.SetWindowText(strText+_T(" - 进度窗口"));
		m_dlgProgress.ShowWindow(SW_SHOW);
	}
}

void CZNetServerDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	// TODO: Add your message handler code here
	if (m_dlgProgress.GetSafeHwnd())
		m_dlgProgress.DestroyWindow();
}

void CZNetServerDlg::ProcessPacket(SOCKET soSocket, CIocpPacket* pPacket)
{
	if (soSocket==INVALID_SOCKET || pPacket==NULL) return;
	
	LoggingX(_T("Enter ProcessPacket"));
	
	CString strTest1, strTest2;
	CIocpPacketHeader& pkHeader=pPacket->GetPacketHeader();
	CArchive ar(&pPacket->GetPacketMem(), CArchive::load|CArchive::bNoFlushOnDelete);
	ar >> strTest1;
	ar >> strTest2;
	ar.Close();		
	CString strFileList;
	for (int j=0; j<pPacket->GetPacketFileCount(); j++)
	{				
		CString strFileName;
		pPacket->GetPacketFile(j, strFileName);
		strFileList += strFileName + _T(";");
	}
	CString strData;
	strData.Format(_T("cmd: %d, wparam: %d, lparam: %d, %s, %s, ""%s"""), 
		pkHeader.m_nCmd, pkHeader.m_wParam, pkHeader.m_lParam, 
		strTest1, strTest2, strFileList);		
	CString strProcessData=_T("processdata - ")+strData;
	Logging4(ERRORLEVEL_INFO, strProcessData, DOMAIN_NAME, CLASS_NAME_ZNETSERVERDLG);	
	
	//若满足条件则发送响应消息,只是测试同步命令用
	if (pkHeader.m_nCmd==2007)	
	{	
		strTest1=_T("工工工工");
		strTest2=_T("KKK");
		CIocpPacket pkAns;
		pkAns.SetPacketHeader(pkHeader, FALSE);
		CArchive arAns(&pkAns.GetPacketMem(), CArchive::store);
		arAns << strTest1;
		arAns << strTest2;
		arAns.Close();
		m_IocpMngr.SendData(soSocket, &pkAns);
	}
	LoggingX(_T("Leave ProcessPacket"));
}

DWORD CZNetServerDlg::SyncSendThread(LPVOID lpVoid)
{
	//发送同步命令数据包的线程
	CZNetServerDlg* pDlg=(CZNetServerDlg*)lpVoid;
	if (pDlg==NULL) return -1;

	CIocpPacketHeader pkHeader;
	pkHeader.m_nCmd = 2007;
	pkHeader.m_wParam = pDlg->m_wParam;
	pkHeader.m_lParam = pDlg->m_lParam;
	CString strTest1=_T("我们");
	CString strTest2=_T("yyy");
	CIocpPacket pk;
	pk.SetPacketHeader(pkHeader);
	CArchive ar(&pk.GetPacketMem(), CArchive::store);
	ar << strTest1;
	ar << strTest2;
	ar.Close();
	
	CString strSeperator=_T(";");
	CString strFileList=pDlg->m_strFileList;
	if (!strFileList.IsEmpty() && 
		strFileList.Right(sizeof(TCHAR))!=strSeperator)
		strFileList += strSeperator;
	int nPos=strFileList.Find(strSeperator);
	while (nPos>0)
	{
		CString strFileName=strFileList.Left(nPos);
		pk.AddPacketFile(strFileName);
		strFileList = strFileList.Mid(nPos+1);
		nPos = strFileList.Find(strSeperator);
	}
	CIocpPacket pkAns;
	int nErr=pDlg->m_IocpMngr.SendData(pDlg->m_nSocket, &pk, &pkAns, INFINITE);
	if (NOERROROCCUR(nErr))
	{
		nErr = pkAns.GetPacketHeader().m_nErrCode;
		if (NOERROROCCUR(nErr))
			LoggingX(_T("sync send success."));
		else
			Logging2(nErr, DOMAIN_NAME);
	}
	else
	{
		LoggingX(_T("sync send fail."));
	}
	
	LoggingX(_T("exist syncsendthread"));
	return 0;
}

DWORD CZNetServerDlg::DisconnectThread(LPVOID lpVoid)
{
	CZNetServerDlg* pDlg=(CZNetServerDlg*)lpVoid;
	if (pDlg==NULL) return -1;
	

	int nErr=pDlg->m_IocpMngr.DisconnectContext(pDlg->m_nSocket);
	if (!NOERROROCCUR(nErr))
	{
		LoggingX(_T("DisconnectContext fail."));
	}	
	LoggingX(_T("exist DisconnectThread"));
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -