C++ 远程控制程序: 使用 Socket 实现 CMD 指令发送与接收
以下是一个简单的 C++ 代码示例,展示了如何创建一个客户端和服务端来实现你的需求。请注意,这只是一个基本示例,可能需要根据你的具体需求进行修改和优化。\n\n客户端代码:\n\ncpp\n#include <iostream>\n#include <winsock2.h>\n\n#pragma comment(lib, "ws2_32.lib")\n\nint main() {\n // 初始化Winsock\n WSADATA wsaData;\n if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {\n std::cout << "Failed to initialize Winsock" << std::endl;\n return 1;\n }\n\n // 创建套接字\n SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0);\n if (clientSocket == INVALID_SOCKET) {\n std::cout << "Failed to create socket" << std::endl;\n WSACleanup();\n return 1;\n }\n\n // 服务器地址和端口\n sockaddr_in serverAddress{};\n serverAddress.sin_family = AF_INET;\n serverAddress.sin_port = htons(8888);\n serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");\n\n // 连接到服务器\n if (connect(clientSocket, (sockaddr*)&serverAddress, sizeof(serverAddress)) == SOCKET_ERROR) {\n std::cout << "Connection failed" << std::endl;\n closesocket(clientSocket);\n WSACleanup();\n return 1;\n }\n\n // 循环接收用户输入并发送给服务器\n std::string userInput;\n while (true) {\n std::cout << "Enter a command: ";\n std::getline(std::cin, userInput);\n\n // 发送用户输入给服务器\n send(clientSocket, userInput.c_str(), userInput.size(), 0);\n\n // 接收服务器返回的信息\n char buffer[4096];\n memset(buffer, 0, sizeof(buffer));\n int bytesRead = recv(clientSocket, buffer, sizeof(buffer), 0);\n if (bytesRead > 0) {\n std::cout << "Server response: " << buffer << std::endl;\n }\n }\n\n // 关闭套接字\n closesocket(clientSocket);\n\n // 清理Winsock\n WSACleanup();\n\n return 0;\n}\n\n\n服务端代码:\n\ncpp\n#include <iostream>\n#include <winsock2.h>\n#include <windows.h>\n\n#pragma comment(lib, "ws2_32.lib")\n\nint main() {\n // 初始化Winsock\n WSADATA wsaData;\n if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {\n std::cout << "Failed to initialize Winsock" << std::endl;\n return 1;\n }\n\n // 创建套接字\n SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, 0);\n if (serverSocket == INVALID_SOCKET) {\n std::cout << "Failed to create socket" << std::endl;\n WSACleanup();\n return 1;\n }\n\n // 监听端口\n sockaddr_in serverAddress{};\n serverAddress.sin_family = AF_INET;\n serverAddress.sin_port = htons(8888);\n serverAddress.sin_addr.s_addr = INADDR_ANY;\n if (bind(serverSocket, (sockaddr*)&serverAddress, sizeof(serverAddress)) == SOCKET_ERROR) {\n std::cout << "Failed to bind socket" << std::endl;\n closesocket(serverSocket);\n WSACleanup();\n return 1;\n }\n\n // 开始监听连接\n if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) {\n std::cout << "Failed to listen" << std::endl;\n closesocket(serverSocket);\n WSACleanup();\n return 1;\n }\n\n std::cout << "Server started, waiting for connections..." << std::endl;\n\n // 接受客户端连接\n SOCKET clientSocket = accept(serverSocket, nullptr, nullptr);\n if (clientSocket == INVALID_SOCKET) {\n std::cout << "Failed to accept client connection" << std::endl;\n closesocket(serverSocket);\n WSACleanup();\n return 1;\n }\n\n std::cout << "Client connected" << std::endl;\n\n // 循环接收客户端发送的指令并执行\n char buffer[4096];\n std::string commandOutput;\n while (true) {\n memset(buffer, 0, sizeof(buffer));\n int bytesRead = recv(clientSocket, buffer, sizeof(buffer), 0);\n if (bytesRead <= 0) {\n std::cout << "Client disconnected" << std::endl;\n break;\n }\n\n // 执行客户端发送的指令\n std::string command(buffer);\n commandOutput = "";\n\n std::cout << "Received command: " << command << std::endl;\n\n // 这里可以根据你的需求使用不同的方式执行命令,这里只是简单示例\n FILE* pipe = _popen(command.c_str(), "r");\n if (pipe) {\n char buffer[128];\n while (!feof(pipe)) {\n if (fgets(buffer, 128, pipe) != nullptr)\n commandOutput += buffer;\n }\n _pclose(pipe);\n }\n\n // 将程序返回的信息发送给客户端\n send(clientSocket, commandOutput.c_str(), commandOutput.size(), 0);\n }\n\n // 关闭套接字\n closesocket(clientSocket);\n closesocket(serverSocket);\n\n // 清理Winsock\n WSACleanup();\n\n return 0;\n}\n\n\n请注意,这个示例只能在Windows系统上运行,并且需要在代码中手动设置IP地址和端口号。你可以根据需要进行修改。
原文地址: https://www.cveoy.top/t/topic/pEEx 著作权归作者所有。请勿转载和采集!