下面是一个使用C++编写的简单的服务器和客户端程序,服务器通过socket向客户端发送cmd指令,并由客户端执行。
服务器端代码:
cpp复制插入
#include <iostream>
#include <winsock2.h>
#include <string>
#pragma comment(lib, "ws2_32.lib")
int main() {
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cerr << "Failed to initialize winsock" << std::endl;
return -1;
}
// 创建socket
SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == INVALID_SOCKET) {
std::cerr << "Failed to create socket" << std::endl;
WSACleanup();
return -1;
}
// 绑定IP和端口
sockaddr_in serverAddr{};
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8888);
serverAddr.sin_addr.s_addr = INADDR_ANY;
if (bind(serverSocket, (struct sockaddr*) &serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
std::cerr << "Failed to bind socket" << std::endl;
closesocket(serverSocket);
WSACleanup();
return -1;
}
// 监听连接
if (listen(serverSocket, 1) == SOCKET_ERROR) {
std::cerr << "Failed to listen on socket" << std::endl;
closesocket(serverSocket);
WSACleanup();
return -1;
}
std::cout << "Waiting for client connection..." << std::endl;
// 接受连接
SOCKET clientSocket;
sockaddr_in clientAddr{};
int clientAddrSize = sizeof(clientAddr);
clientSocket = accept(serverSocket, (struct sockaddr*) &clientAddr, &clientAddrSize);
if (clientSocket == INVALID_SOCKET) {
std::cerr << "Failed to accept client connection" << std::endl;
closesocket(serverSocket);
WSACleanup();
return -1;
}
std::cout << "Client connected" << std::endl;
// 发送cmd指令给客户端
std::string cmd;
while (true) {
std::cout << "Enter cmd command (or 'exit' to exit): ";
std::getline(std::cin, cmd);
// 发送cmd指令
send(clientSocket, cmd.c_str(), cmd.size(), 0);
if (cmd == "exit") {
break;
}
// 接收客户端执行结果
char buffer[4096];
memset(buffer, 0, sizeof(buffer));
if (recv(clientSocket, buffer, sizeof(buffer) - 1, 0) == SOCKET_ERROR) {
std::cerr << "Failed to receive data from client" << std::endl;
break;
}
std::cout << "Received result from client:" << std::endl;
std::cout << buffer << std::endl;
}
// 关闭连接
closesocket(clientSocket);
closesocket(serverSocket);
WSACleanup();
std::cout << "Server terminated" << std::endl;
return 0;
}
复制插入
客户端代码:
cpp复制插入
#include <iostream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
int main() {
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cerr << "Failed to initialize winsock" << std::endl;
return -1;
}
// 创建socket
SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket == INVALID_SOCKET) {
std::cerr << "Failed to create socket" << std::endl;
WSACleanup();
return -1;
}
// 连接到服务器
sockaddr_in serverAddr{};
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8888);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
if (connect(clientSocket, (struct sockaddr*) &serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
std::cerr << "Failed to connect to server" << std::endl;
closesocket(clientSocket);
WSACleanup();
return -1;
}
// 接收并执行服务器发来的cmd指令
while (true) {
char buffer[4096];
memset(buffer, 0, sizeof(buffer));
if (recv(clientSocket, buffer, sizeof(buffer) - 1, 0) == SOCKET_ERROR) {
std::cerr << "Failed to receive cmd command from server" << std::endl;
break;
}
std::string cmd(buffer);
if (cmd == "exit") {
break;
}
std::cout << "Received cmd command from server: " << cmd << std::endl;
// 执行cmd指令
FILE* pipe = _popen(cmd.c_str(), "r");
if (!pipe) {
std::cerr << "Failed to execute cmd command" << std::endl;
break;
}
std::cout << "Executing cmd command..." << std::endl;
std::string result;
char buffer2[128];
while (!feof(pipe)) {
if (fgets(buffer2, 128, pipe) != nullptr)
result += buffer2;
}
_pclose(pipe);
// 将执行结果发送给服务器
send(clientSocket, result.c_str(), result.size(), 0);
}
// 关闭连接
closesocket(clientSocket);
WSACleanup();
std::cout << "Client terminated" << std::endl;
return 0;
}
复制插入
请注意,这只是一个简单的示例程序,没有处理错误和异常情况。在实际使用中,应该进行错误处理、合理的输入验证和安全措施。
制作不易,请点赞加关注