网络化计算机性能检测软件的开发,可对指定目标主机的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;
}

运行效果:

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

网络编程——基于UDP的网络化CPU性能检测的更多相关文章

  1. 网络编程(基于udp协议的套接字/socketserver模块/进程简介)

    一.基于UDP协议的套接字 TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就 ...

  2. JAVA基础知识之网络编程——-基于UDP协议的通信例子

    UDP是一种不可靠的协议,它在通信两端各建立一个socket,这两个socket不会建立持久的通信连接,只会单方面向对方发送数据,不检查发送结果. java中基于UDP协议的通信使用DatagramS ...

  3. UNIX网络编程——基于UDP协议的网络程序

    一.下图是典型的UDP客户端/服务器通讯过程 下面依照通信流程,我们来实现一个UDP回射客户/服务器: #include <sys/types.h> #include <sys/so ...

  4. 网络编程: 基于UDP协议的socket

    udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接 UDP协议的通信优势: 允许一个服务器同时和多个客户端通信, TCP不行 服务端 import socket sk = socket ...

  5. Java 网络编程 --基于UDP实现一对一聊天功能

    UDP 基本流程: UDP发送端基本流程: 1.使用DatagramSocket 指定端口 创建发送端 2.准备数据 一定转成字节数组 3. 封装成DatagramPacket 包裹,需要指定目的地 ...

  6. 网络编程 单纯UDP通信

    网络编程 单纯UDP通信 1,UDP发送端 2,UDP接收端 UDP发送端: #include <stdio.h> #include <unistd.h> #include & ...

  7. java:网络编程(UDP (DatagramSocket和DatagramPacket)正则表达式)

    java:网络编程(UDP (DatagramSocket和DatagramPacket)正则表达式) * TCP* 特点:面向连接,点对点的通信,效率较低,但安全可靠* UDP:用户数据报协议,类似 ...

  8. Java 网络编程 -- 基于TCP 模拟多用户登录

    Java TCP的基本操作参考前一篇:Java 网络编程 – 基于TCP实现文件上传 实现多用户操作之前先实现以下单用户操作,假设目前有一个用户: 账号:zs 密码:123 服务端: public c ...

  9. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

随机推荐

  1. 基于FPGA具有容错能理的异步串口程序设计

    首先,问题源于一个项目.本来是一个很简单的多个串口收发FIFO存取数据的小程序,通过电脑验证也可用,而下位机板子之间通信就出现了丢数问题. 经过分析原因如下: 我的串口收模块是基于特权同学的开发板程序 ...

  2. ASP.NET MVC 小牛之旅3:Routing——网址路由

    网址路由(Routing)在ASP.NET MVC中有两个主要用途,一个用途是匹配通过浏览器传来的HTTP请求,另一个用途则是响应适当的网址给浏览器. 3.1匹配通过浏览器传来的HTTP请求 首先我们 ...

  3. Docker 企业级镜像仓库 Harbor 的搭建与维护

    目录 一.什么是 Harbor 二.Harbor 安装 2.1.Harbor 安装环境 2.2.Harbor安装 2.3 配置HTTPS 三.Harbor 的使用 3.1.登录Harbor并使用 3. ...

  4. 商派OMS增加PMC跟生产中心角色权限思路

    一.目标:根据现有的商派OMS框架逻辑二开 PMC中(外协单位.生产中心)角色权限(如:下图的仓库角色,根据[接单元.发货员.仓库管理员],选择一或多的版权仓库,同理,如外协单位根据[**.** .* ...

  5. 读《JavaScript权威指南》笔记(一)

    1.Number()  parseInt()  parseFloat() 如果通过Number()转换函数传入一个字符串,它会试图将其转换为一个整数或浮点数直接量,这个方法只能基于十进制数进行转换,并 ...

  6. FJOI2019全记录(福建省选)

    Day 0 最后一个早上,早读完后就到机房里,复习了左偏树和计算几何,然后真的不知道还要做什么了(FFT和一些数论的结论昨天复习过了 也许还要去学一点新东西(?),像Krusk重构树什么的.(一直没有 ...

  7. 我的省选 Day -5

    Day -5 时间载着我们,一天又一天,呼啸而过. 已经记不清今天是Day 负几了,总之还有不到一个星期就要去参加选拔赛了. 写一下今晚做NOI2009的心路历程. T1题意有点绕,但很快看出是个二分 ...

  8. POJ1009 Edge Detection

    题目来源:http://poj.org/problem?id=1009 题目大意: 某图像公司用run length encoding(RLE)的方式记录和存储了大量的图像.程序的目标是读入压缩后的图 ...

  9. jquery——下载、使用

    jQuery是目前使用最广泛的javascript函数库. 怎样安装? 这是下载地址:https://code.jquery.com/ minified是压缩版的 新建一个网页打开上面这个网址,ctr ...

  10. ACdream 1216——Beautiful People——————【二维LIS,nlogn处理】

    Beautiful People Special Judge Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (J ...