网络编程——基于UDP的网络化CPU性能检测
网络化计算机性能检测软件的开发,可对指定目标主机的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性能检测的更多相关文章
- 网络编程(基于udp协议的套接字/socketserver模块/进程简介)
一.基于UDP协议的套接字 TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就 ...
- JAVA基础知识之网络编程——-基于UDP协议的通信例子
UDP是一种不可靠的协议,它在通信两端各建立一个socket,这两个socket不会建立持久的通信连接,只会单方面向对方发送数据,不检查发送结果. java中基于UDP协议的通信使用DatagramS ...
- UNIX网络编程——基于UDP协议的网络程序
一.下图是典型的UDP客户端/服务器通讯过程 下面依照通信流程,我们来实现一个UDP回射客户/服务器: #include <sys/types.h> #include <sys/so ...
- 网络编程: 基于UDP协议的socket
udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接 UDP协议的通信优势: 允许一个服务器同时和多个客户端通信, TCP不行 服务端 import socket sk = socket ...
- Java 网络编程 --基于UDP实现一对一聊天功能
UDP 基本流程: UDP发送端基本流程: 1.使用DatagramSocket 指定端口 创建发送端 2.准备数据 一定转成字节数组 3. 封装成DatagramPacket 包裹,需要指定目的地 ...
- 网络编程 单纯UDP通信
网络编程 单纯UDP通信 1,UDP发送端 2,UDP接收端 UDP发送端: #include <stdio.h> #include <unistd.h> #include & ...
- java:网络编程(UDP (DatagramSocket和DatagramPacket)正则表达式)
java:网络编程(UDP (DatagramSocket和DatagramPacket)正则表达式) * TCP* 特点:面向连接,点对点的通信,效率较低,但安全可靠* UDP:用户数据报协议,类似 ...
- Java 网络编程 -- 基于TCP 模拟多用户登录
Java TCP的基本操作参考前一篇:Java 网络编程 – 基于TCP实现文件上传 实现多用户操作之前先实现以下单用户操作,假设目前有一个用户: 账号:zs 密码:123 服务端: public c ...
- 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程
Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...
随机推荐
- 【Sping管理bean的原理】
spring容器默认情况下,当服务启动时,解析配置文件,实例化文件中的所有类. 我们直接使用spring时,获取spring注入的bean是这样的, ApplicationContext ctx = ...
- web.config中authorization下的location中的path的设置 (转)
项目下 有三个文件夹 A,B,C 验正方式是 Forms 验正 我要设置他们的访问权限为, A,匿名可访问 B,普通用户授权后才能访问 C,只允许管理员访问 <configuration> ...
- pandas中df.ix, df.loc, df.iloc 的使用场景以及区别
pandas中df.ix, df.loc, df.iloc 的使用场景以及区别: https://stackoverflow.com/questions/31593201/pandas-iloc-vs ...
- cogs 2620. [HEOI2012]朋友圈
/*70分 被卡T*/ #include<iostream> #include<cstdio> #include<cstring> using namespace ...
- Oracle表连接(转)
表之间的连接 Join是一种试图将两个表结合在一起的谓词,一次只能连接2个表,表连接也可以被称为表关联.在后面的叙述中,我们将会使用”row source”来代替”表”,因为使用row source更 ...
- 关于特殊目录如com null无法删除的处理办法
1.把以下批处理做成一个del.bat放在桌面 del /f /a /q \\?\%1 rd /s /q \\?\%1 2.需要删除的文件或者文件夹拉到这个文件上就可以了 可以删除没有属性项目中没有安 ...
- vue 中的.sync语法糖
提到父子组件相互通信,可能大家的第一反应是$emit,最近在学着封装组件,以前都是用的别人封装好的UI组件,对vue中的.sync这个修饰符有很大的忽略,后来发现这个修饰符很nice,官方对她的描述是 ...
- Exadata中的dbserver_backup.sh脚本
dbserver_backup.sh脚本在老版本的exadata中,它存放在/opt/oracle.SupportTools目录中,主要用于/根文件系统和/boot分区的备份.dbserver_bac ...
- POJ1032 Parliament
题目来源:http://poj.org/problem?id=1032 题目大意:给定一个正整数N(5<=N<=1000),将N拆为若干个不同的数使得它们的乘积最大(找到一组互不相等,和为 ...
- An internal error occurred during: "Add Deployment". Container with path org.eclipse.jdt.launching.
导入非本机项目出现这种错误,原因就是JDK版本不一致. 具体解决步骤如下: 右键项目名→Properties→JavaBuild Path→Libraries→选中JRE SystemLibrary[ ...