📄 znetserverdlg.cpp
字号:
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 + -