网络化计算机性能检测软件的开发,可对指定目标主机的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. C# Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).

    一.问题描述 在做C# 的 Guid 转换时,出现这个问题:Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-x ...

  2. 深度学习之Keras

    Keras简介 Keras是一个高层神经网络API,Keras完全由Python编写而成,使用Tensorflow.Theano及CNTK作为后端. 通过Python脚本查看Keras使用的后端 输出 ...

  3. 说一说solr在tomcat,jetty上的运行和安装优缺点

    本文是我从别的文章中组合而成的,结合自己实际操作进行了修改. Solr是什么 Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr提供了比Lu ...

  4. 开发外包注意事项——iOS APP的开发

    1. APP外包的流程是怎样的? 一般外包的项目都需要经常这几个流程: 1)需求沟通:双方沟通项目的需求,对项目的可行性进行分析 2)工作量评估:在确认了项目的需求后,外包团队对项目的价钱和进度进行评 ...

  5. 帝都Day5——依旧是数据结构

    /*Day1.Day2我尽量整理吧*/ 树状数组 树状数组滋瓷单点修改和前缀查询 加特技可以使得树状数组支持更多操作. c[2n+1]=a[2n+1](奇数就是它本身) c[2n]≠a[2n](偶数不 ...

  6. CPU死锁

    https://blog.csdn.net/sunny05296/article/details/82858071 最近碰到了Centos7.2上终端打印soft lockup CPU死锁,系统无响应 ...

  7. thinphp5会员注册邮箱验证

    1.首先完成邮箱发送http://www.cnblogs.com/jcydd/p/7299750.html 2.在完成会员新增后执行后置函数,在模型类当中 //注册后置函数 protected sta ...

  8. Vue中的指令(听博主说总结的很好)

    指令[重点] 作用:简化Dom操作 参考:https://cn.vuejs.org/v2/api/#%E6%8C%87%E4%BB%A4 特点: 1.都是以v-开头 2.除了插值表达式,其它都写在标签 ...

  9. Codeforces Round #467(Div2)题解

    凌晨起来打CF,0:05,也是我第一次codeforces 第一题: 我刚开始怀疑自己读错题了,怎么会辣么水. 判除了0的数字种类 #include <cstdio> ; ]; int m ...

  10. Windows安装IIS后,启动网站报错:不能在此路径中使用此配置节……

    在IIS里启动设置好的网站(ASP.net网站),浏览器报如下错误: 不能在此路径中使用此配置节.如果在父级别上锁定了该节,便会出现这种情况.锁定是默认设置的(overrideModeDefault= ...