网络化计算机性能检测软件的开发,可对指定目标主机的CPU利用率进行远程检测,并自动对远程主机执行性能指标进行周期性检测,最终实现图形化显示检测结果。

网络通信模块:(客户端类似,因为udp是对等通信)

启动服务器:创建套接字并注册网络事件
void CRemoteCPUImitateDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
int Ret;
char BufferData[] = { };
int ClientAddrSize = sizeof(ClientAddress);
GetDlgItem(IDOK)->EnableWindow(FALSE); memset(BufferData, , sizeof(BufferData)); ServerAddress.sin_port = htons();
ServerAddress.sin_family = AF_INET;
ServerAddress.sin_addr.s_addr = INADDR_ANY; //初始化本地网卡 m_ServerSocket = WSASocket(AF_INET, SOCK_DGRAM, , NULL, , );
if (m_ServerSocket == SOCKET_ERROR)
{
MessageBox(L"创建套接字失败!");
return ;
} int Result = bind(m_ServerSocket, (sockaddr*)&ServerAddress, sizeof(ServerAddress));
if (Result != )
{
int a = GetLastError();
MessageBox(L"绑定套接字失败!");
return;
} if (WSAAsyncSelect(m_ServerSocket, m_hWnd, UM_RECV, FD_ALL_EVENTS))
{
MessageBox(L"注册网络读取事件失败!");
return;
} } 网络事件响应函数
afx_msg LRESULT CRemoteCPUImitateDlg::OnUmRecv(WPARAM wParam, LPARAM lParam)
{
int Ret;
int i;
memset(BufferData, , sizeof(BufferData));
int ClientAddrSize = sizeof(ClientAddress);
memset(&ClientAddress, , sizeof(ClientAddress));
if (WSAGETSELECTERROR(lParam))
{
return false;
}
else
{
switch (WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT://接受客户端连接请求。
{
MessageBox(L"FD_ACCEPT"); }
break;
case FD_READ://可读,接收数据。
{
if ((Ret = recvfrom(m_ServerSocket, BufferData, , , (SOCKADDR *)&ClientAddress, &ClientAddrSize))
== SOCKET_ERROR)
{
//MessageBox(L"接受数据失败");
closesocket(m_ServerSocket);
return ;
}
else
{
BYTE bToken = (BYTE)BufferData[];
switch (bToken)
{
case ://登录
{
LOGIN_INFORMATION* li = (LOGIN_INFORMATION*)BufferData; CString str,strIP, strAddr, strPCName, strOS, strCPU, strPing; int ClientLength = sizeof(sockaddr_in);
strIP = inet_ntoa(ClientAddress.sin_addr); for (i = ; i < m_ListUser.GetItemCount(); i++)
{
str = m_ListUser.GetItemText(i, );
if (str == strIP)
{
MessageBox(L"该用户已在线!");
return ;
}
}
//主机名称
strPCName = li->PCName; switch (li->OsVerInfoEx.dwPlatformId)
{ case VER_PLATFORM_WIN32_NT:
if (li->OsVerInfoEx.dwMajorVersion <= )
strOS = "WindowsNT";
if (li->OsVerInfoEx.dwMajorVersion == && li->OsVerInfoEx.dwMinorVersion == )
strOS = "Windows2000";
if (li->OsVerInfoEx.dwMajorVersion == && li->OsVerInfoEx.dwMinorVersion == )
strOS = "WindowsXP";
if (li->OsVerInfoEx.dwMajorVersion == && li->OsVerInfoEx.dwMinorVersion == )
strOS = "Windows2003";
if (li->OsVerInfoEx.dwMajorVersion == && li->OsVerInfoEx.dwMinorVersion == )
strOS = "WindowsVista";
if (li->OsVerInfoEx.dwMajorVersion == && li->OsVerInfoEx.dwMinorVersion == )
strOS = "Windows7";
if (li->OsVerInfoEx.dwMajorVersion == && li->OsVerInfoEx.dwMinorVersion == )
strOS = "Windows10";
}
//CPU
strCPU.Format(L"%dMHz", li->CPUMHz);
//网速
strPing.Format(L"%d", li->Speed);
AddList(strIP, strPCName, strOS, strCPU, strPing);
break; }
case ://cpu信息
{
sumCpu = (UINT)BufferData[sizeof(BYTE)];
if (Dlg == NULL)
{
return ;
}
Dlg->m_sumCpu = sumCpu;
WPARAM a;
a = sumCpu;
::PostMessage(Dlg->GetSafeHwnd(), UM_CHANGE, a, );
break; }
case ://下线
{
CString strIP, str; strIP = inet_ntoa(ClientAddress.sin_addr);
for (i = ; i < m_ListUser.GetItemCount() ; i++)
{
str = m_ListUser.GetItemText(i, );
if (str == strIP)
{
m_ListUser.DeleteItem(i);
}
}
break;
}
default:
break;
} }
//在新接受的套接字发生FD_READ,FD_WRITE,FD_CLOSE网络事件发生,发送WM_SOCKET消息;
//WSAAsyncSelect(sAccept, this->m_hWnd, UM_RECV, FD_READ | FD_WRITE | FD_CLOSE);
}
break;
case FD_WRITE://可写,发送数据。
{
//MessageBox(L"FD_WRITE"); }
break;
case FD_CLOSE://对方关闭套接字连接。
{
if (WSAGETSELECTERROR(lParam) == )
{
//从容关闭。
}
else if (WSAGETSELECTERROR(lParam) == WSAECONNREFUSED)
{
//硬关闭。
} }
break;
default:
break;
}
}
return ;
}

CPU图像绘制模块:(参考了网上的代码)

绘制CPU使用率进度条
UINT CDisplayDlg::DoSysCpu(LPVOID pParam)
{
CDisplayDlg *pthis = (CDisplayDlg *)pParam;
CString showCpu;
UINT sumCpu = ;
if (bFirst)
{
bFirst = FALSE;
m_sumCpu = ;
}
else
{
sumCpu = m_sumCpu;
} sumCpu = sumCpu % ;
pthis->m_Process_CPU.SetPos(sumCpu);
showCpu.Format(L"%u %%", sumCpu);
pthis->GetDlgItem(IDC_STATIC_CPU)->SetWindowText(showCpu);
pthis->UpdateWindow();
pthis->Invalidate(FALSE);
::PostMessage(pthis->GetSafeHwnd(), WM_PAINT, , );
return ;
}
4.5 绘制CPU使用记录折线
BOOL CDisplayDlg::CDrawCpu(CDC *pDC)
{
CRect rect;
GetDlgItem(IDC_SHOWCPU)->GetClientRect(&rect);
CDC dcMem; //用于缓冲作图的内存DC
CBitmap bmp; //内存中承载临时图象的位图
CBitmap *oldBmp;
dcMem.CreateCompatibleDC(pDC); //依附窗口DC创建兼容内存DC bmp.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());//创建兼容位图 oldBmp = dcMem.SelectObject(&bmp); //将位图选择进内存DC int i = ;
//绘图 //背景 dcMem.FillSolidRect(rect, RGB(, , )); CPen pen;
if (!pen.CreatePen(PS_DOT, , RGB(, , )))
{
return FALSE;
} CPen *pOldPen = dcMem.SelectObject(&pen);//保存旧画笔 //横线
for (i = ; i < ; i++)
{
dcMem.MoveTo(, rect.Height()*i / );
dcMem.LineTo(rect.Width(), rect.Height()*i / );
} //竖线
for (i = ; i < ; i++)
{
dcMem.MoveTo(rect.Width()*i / , );
dcMem.LineTo(rect.Width()*i / , rect.Height());
} //收回资源并释放
dcMem.SelectObject(pOldPen);
pen.DeleteObject(); //绘制四边(防止闪烁) dcMem.MoveTo(, );
dcMem.LineTo(rect.Width(), ); dcMem.MoveTo(, rect.Height() - );
dcMem.LineTo(rect.Width(), rect.Height() - ); dcMem.MoveTo(, );
dcMem.LineTo(, rect.Height()); dcMem.MoveTo(rect.Width() - , );
dcMem.LineTo(rect.Width() - , rect.Height()); //绘制CPU运行状态线
if (!pen.CreatePen(, , RGB(, , )))
{
return FALSE;
} pOldPen = dcMem.SelectObject(&pen);//保存旧画笔 pointCpu[].x = rect.Width();
pointCpu[].y = rect.Height() - rect.Height()*m_sumCpu / ; for (i = m_nMovNum; i > ; i--)
{
if (i > )
{
dcMem.MoveTo(pointCpu[i - ]);
dcMem.LineTo(pointCpu[i - ]);
} pointCpu[i].x = pointCpu[i - ].x - rect.Width() / maxpix - ;
pointCpu[i].y = pointCpu[i - ].y; } dcMem.SelectObject(pOldPen);
pen.DeleteObject();
pOldPen = NULL; //将内存DC上的图象拷贝到前台
pDC->BitBlt(, , rect.Width(), rect.Height(), &dcMem, , , SRCCOPY); //释放资源
dcMem.SelectObject(oldBmp);
dcMem.DeleteDC(); //删除DC
bmp.DeleteObject(); //删除位图 return TRUE;
}

运行效果:

附件:源码(客户端和服务器)

最新文章

  1. Jenkins 集成打包和上传 App Store 的冲突
  2. mxnet目录结构
  3. Storm DRPC实现机制分析
  4. Java开发中程序和代码性能优化
  5. meta标签清理缓存
  6. jstree级联查找树
  7. ADO.NET笔记——将DataReader作为函数返回值
  8. ALT+数字,可输入汉字或拉丁字母 good
  9. 【Oracle】-【插入读取顺序】-插入读取之间的顺序关系
  10. heritrix1.14.4配置-没有add和change按钮的问题
  11. Android中查看布局文件中的控件(view,id)在哪里被调用(使用)
  12. Java IO学习笔记(三)转换流、数据流、字节数组流
  13. angular点击查看更多(简单demo)
  14. 初时Windows程序
  15. HTML-JS 循环 函数 递归
  16. 菜鸟学SSH(十七)——基于注解的SSH将配置精简到极致
  17. openstack 部署(Q版)-----glance镜像服务安装配置
  18. PHP写日志公共类
  19. WPF之数据触发器 改变控件背景色或闪烁
  20. centos7安装 docker

热门文章

  1. 新安装的 ubuntu 下 make menuconfig 报错
  2. Kolla Ocata版本安装及镜像制作流程
  3. AOP分析
  4. 关于苹果出现NaN的情况----由Date格式解析方式不同引起的Bug
  5. Windows安装IIS后,启动网站报错:不能在此路径中使用此配置节……
  6. 牛客假日团队赛1B.便便传送门(一)
  7. BestCoder Round #86 1002
  8. bootstrap multiselect的使用 多选下拉菜单
  9. QT 简单的计算器例子
  10. Oracle视图,索引,序列