資源簡介
通過向通過狀態下的目標計算機網卡發送魔術包,遠程控制目標計算機開機; 以及遠程控制計算機關機。
代碼片段和文件信息
/******
?*?WakeOnLAN
?*?注意:需要設置廣播地址,例如:192.168.1.255
?******/
#include?
#include?
#include?
#include?“TRemoteCtrlPC.h“
TRemoteCtrlPC::TRemoteCtrlPC(Qobject?*parent)
{
????Q_UNUSED(parent)
}
/*?Note:
?*?被控計算機需要支持網絡喚醒功能(Wake?on?LAN)
?*?1.組織魔法包(MgicPacket)?由6字節0xFF和重復16次的MAC地址??102字節
?*?2.通過UDP的方式廣播?IP地址為路由的廣播地址?如:網段為192.168.1.xIP設為192.168.1.255
?*?@strMac:??格式示例?“20:af:0a:47:aa:bb“
?*/
void?TRemoteCtrlPC::wakeOnLAN(QString?strMac)
{
????/*將字符串MAC轉換成十六進制?存入數組*/
????char?cstrMacAddr[6];
????bool?isOK;
????for(int?j?=?0;j?6;?j++){
????????if(j?5){
????????????cstrMacAddr[j]?=?strMac.mid(strMac.indexOf(“:“j*3)?-?22).toInt(&isOK16);
????????????if(false?==?isOK)
????????????????return?;
????????}else?if(j?==?5){
????????????cstrMacAddr[j]?=?strMac.mid(strMac.indexOf(“:“j*3?-?1)?+?12).toInt(&isOK16);
????????????if(false?==?isOK)
????????????????return?;
????????}
????}
????/*構建一個魔術喚醒包??6字節0xFF?和??16次的?Mac地址*/
????QByteArray?magicPacket;
????/*6個?0xFF*/
????for(int?i?=?0;i?6;?i++){
????????magicPacket[i]?=?0xFF;
????}
????/*16個?MAC*/
????for(int?k?=?0;?k?16;?k++)
????{
????????for(int?l?=?0;?l?6;?l++)
????????????magicPacket[(k+1)*6?+?l]?=?cstrMacAddr[l];
????}
????QHostAddress?FakeAddress;
????FakeAddress.setAddress?(“255.255.255.255“);
????QUdpSocket?udpSocket;
????udpSocket.writeDatagram(magicPacket?102?FakeAddress?9);
}
/*?https://blog.csdn.net/smstong/article/details/16879347?*/
/*?https://www.cnblogs.com/shenjieblog/p/5455691.html
*?Note:實現遠程關機原理
*?1.用戶管理:被控計算機啟用來賓賬戶(Guest)
*?2.運行gpedit.msc??允許Guest強制關機??拒絕從網絡訪問計算機里刪除??Guest
*/
void?TRemoteCtrlPC::remoteShutDown(QString?strIp)
{
????m_strIp?=?strIp;
????/*命令的執行過程會阻塞?放入線程執行*/
????this->start();
}
void?TRemoteCtrlPC::run()
{
????QProcess?cmd;
????QString?strResult;
????QByteArray?arrayOut;
????QString?strCmd?=?“shutdown?-s?-t?5?-m?\\\\“;?//四個斜杠??轉義
????strCmd?+=?m_strIp;
???//?qDebug()<<“關閉電腦:“<
????cmd.start(strCmd);
????cmd.waitForFinished();???????//?!!!阻塞操作?放在主線程會導致窗口卡死??直至執行完成
????arrayOut?=?cmd.readAllStandardOutput();
????strResult?=?QString::fromLocal8Bit(arrayOut);
????emit?signalCmdFinished(strResult);?//命令執行完成???返回命令執行結果
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????????452??2020-06-14?10:06??tremotectrlpc.h
?????文件????????1621??2020-06-14?10:24??ttestforremotectrlpc.cpp
?????文件?????????570??2020-06-14?10:06??ttestforremotectrlpc.h
?????文件????????2724??2020-06-22?07:30??tremotectrlpc.cpp
- 上一篇:使用wxWidgets進行跨平臺程序開發
- 下一篇:Qt5串口通信-windows
評論
共有 條評論