网络化计算机性能检测软件的开发,可对指定目标主机的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. 前端中的事件循环eventloop机制

    我们知道 js 是单线程执行的,那么异步的代码 js 是怎么处理的呢?例如下面的代码是如何进行输出的: console.log(1); setTimeout(function() { console. ...

  2. 2018上海大都会邀请赛J(数位DP)

    #include<bits/stdc++.h>using namespace std;int num[20];//按位储存数字int mod;long long dp[20][110][1 ...

  3. oracle语句解析顺序

  4. cf834D(dp+线段树区间最值,区间更新)

    题目链接: http://codeforces.com/contest/834/problem/D 题意: 每个数字代表一种颜色, 一个区间的美丽度为其中颜色的种数, 给出一个有 n 个元素的数组, ...

  5. postgres_fdw

    create extension postgres_fdw; --创建扩展 create server db0 foreign data wrapper postgres_fdw OPTIONS (h ...

  6. CF10D/POJ2127 LCIS解题报告

    题目传送门(洛谷)(CF)(POJ) 前言 期末考试前的最后一篇题解,希望期末考  rp++ 奇怪,为什么在CF上能过的代码到POJ上就 听取WA声一片  (不管了) 题目思路 LCIS模版O(n²) ...

  7. 牛客练习赛43D(贪心)

    有生之年我居然也能不看题解做出来题QAQ-- 发现c.d是0.1序列而不是随机数列说明有蹊跷,于是发现负数直接配0,正数配1即可.不知道哪个最小,那就全求一下吧--我的做法的坑点是数正好为1时不可以选 ...

  8. 【ACM】子串和 - 贪心算法

    子串和 时间限制:5000 ms  |  内存限制:65535 KB 难度:3   描述 给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最 ...

  9. Gym 101047K Training with Phuket's larvae

    http://codeforces.com/gym/101047/problem/K 题目:给定n<=2000条绳子,要你找出其中三条,围成三角形,并且要使得围成的三角形面积最小 思路: 考虑一 ...

  10. (转)深入浅出linux系统umask值及其对应的文件权限讲解

    浅出linux系统umask值及其对应的文件权限讲解 原文:http://blog.51cto.com/oldboy/1060032 缘起:1.此文的撰写特别为感谢51cto的博客工作人员和领导,老男 ...