请用C++制作一个 客户端在cmd输入指令回车后发送给服务端服务端接收后给名为xxx的程序发送客户端的信息相当于客户端远程输入并且实时将这个程序返回的信息发送给客户端让客户端在cmd显示。
以下是一个基于C++的简单示例,展示了如何实现一个客户端和服务端的通信,并将服务端返回的信息发送给客户端。
// 服务端代码
#include <iostream>
#include <winsock2.h>
#include <windows.h>
#pragma comment(lib, "ws2_32.lib")
int main() {
WSADATA wsaData;
SOCKET serverSocket, clientSocket;
SOCKADDR_IN serverAddr, clientAddr;
char buffer[1024];
// 初始化Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cout << "Failed to initialize winsock." << std::endl;
return -1;
}
// 创建套接字
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == INVALID_SOCKET) {
std::cout << "Failed to create socket." << std::endl;
return -1;
}
// 设置服务器地址和端口
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::cout << "Failed to bind socket." << std::endl;
closesocket(serverSocket);
WSACleanup();
return -1;
}
// 监听连接
listen(serverSocket, 5);
std::cout << "Server is listening for incoming connections..." << std::endl;
// 接受客户端连接
int clientAddrSize = sizeof(clientAddr);
clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &clientAddrSize);
if (clientSocket == INVALID_SOCKET) {
std::cout << "Failed to accept client connection." << std::endl;
closesocket(serverSocket);
WSACleanup();
return -1;
}
std::cout << "Client connected!" << std::endl;
// 接收客户端发送的指令,并发送给目标程序
while (true) {
memset(buffer, 0, sizeof(buffer));
int bytesRead = recv(clientSocket, buffer, sizeof(buffer), 0);
if (bytesRead <= 0) {
std::cout << "Client disconnected." << std::endl;
break;
}
// 将buffer中的指令发送给名为"xxx"的程序,并获取返回结果
std::string command(buffer);
std::string result;
// 调用名为"xxx"的程序,将command发送给它,并获取返回结果赋值给result
// ...
// 将结果发送给客户端
send(clientSocket, result.c_str(), result.length(), 0);
}
// 关闭套接字
closesocket(clientSocket);
closesocket(serverSocket);
// 清理Winsock
WSACleanup();
return 0;
}
// 客户端代码
#include <iostream>
#include <winsock2.h>
#include <windows.h>
#pragma comment(lib, "ws2_32.lib")
int main() {
WSADATA wsaData;
SOCKET clientSocket;
SOCKADDR_IN serverAddr;
char buffer[1024];
// 初始化Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cout << "Failed to initialize winsock." << std::endl;
return -1;
}
// 创建套接字
clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket == INVALID_SOCKET) {
std::cout << "Failed to create socket." << std::endl;
return -1;
}
// 设置服务器地址和端口
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::cout << "Failed to connect to server." << std::endl;
closesocket(clientSocket);
WSACleanup();
return -1;
}
std::cout << "Connected to server." << std::endl;
// 读取用户输入的指令并发送给服务端
while (true) {
std::string command;
std::cout << "Enter a command: ";
std::getline(std::cin, command);
if (command == "exit") {
break;
}
send(clientSocket, command.c_str(), command.length(), 0);
// 接收服务端返回的信息并显示在控制台
memset(buffer, 0, sizeof(buffer));
int bytesRead = recv(clientSocket, buffer, sizeof(buffer), 0);
if (bytesRead <= 0) {
std::cout << "Server disconnected." << std::endl;
break;
}
std::cout << "Server response: " << buffer << std::endl;
}
// 关闭套接字
closesocket(clientSocket);
// 清理Winsock
WSACleanup();
return 0;
}
请确保在编译和运行代码之前已经正确配置了Winsock库
原文地址: https://www.cveoy.top/t/topic/hVyc 著作权归作者所有。请勿转载和采集!