以下是在 VS2022 中使用 C++ 语言编写控制台应用程序实现自动回声功能的代码示例,包含客户端和服务器端。
### 服务器端代码
```cpp
#include <iostream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#define PORT 12345
#define BUFFER_SIZE 1024
int main() {
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cerr << "WSAStartup failed." << std::endl;
return 1;
}
SOCKET listenSocket = socket(AF_INET, SOCK_STREAM, 0);
if (listenSocket == INVALID_SOCKET) {
std::cerr << "Socket creation failed." << std::endl;
WSACleanup();
return 1;
}
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_port = htons(PORT);
if (bind(listenSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
std::cerr << "Bind failed." << std::endl;
closesocket(listenSocket);
WSACleanup();
return 1;
}
if (listen(listenSocket, 5) == SOCKET_ERROR) {
std::cerr << "Listen failed." << std::endl;
closesocket(listenSocket);
WSACleanup();
return 1;
}
std::cout << "Server listening on port " << PORT << std::endl;
sockaddr_in clientAddr;
int clientAddrLen = sizeof(clientAddr);
SOCKET clientSocket = accept(listenSocket, (sockaddr*)&clientAddr, &clientAddrLen);
if (clientSocket == INVALID_SOCKET) {
std::cerr << "Accept failed." << std::endl;
closesocket(listenSocket);
WSACleanup();
return 1;
}
char buffer[BUFFER_SIZE];
while (true) {
int bytesReceived = recv(clientSocket, buffer, BUFFER_SIZE, 0);
if (bytesReceived <= 0) {
break;
}
buffer[bytesReceived] = '\0';
std::cout << "Received message: " << buffer << ", Length: " << bytesReceived << std::endl;
send(clientSocket, buffer, bytesReceived, 0);
}
closesocket(clientSocket);
closesocket(listenSocket);
WSACleanup();
return 0;
}
```
### 客户端代码
```cpp
#include <iostream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#define SERVER_IP "127.0.0.1"
#define PORT 12345
#define BUFFER_SIZE 1024
int main() {
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cerr << "WSAStartup failed." << std::endl;
return 1;
}
SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket == INVALID_SOCKET) {
std::cerr << "Socket creation failed." << std::endl;
WSACleanup();
return 1;
}
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP);
serverAddr.sin_port = htons(PORT);
if (connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
std::cerr << "Connect failed." << std::endl;
closesocket(clientSocket);
WSACleanup();
return 1;
}
char buffer[BUFFER_SIZE];
while (true) {
std::cout << "Enter message to send (or 'quit' to exit): ";
std::cin.getline(buffer, BUFFER_SIZE);
if (std::string(buffer) == "quit") {
break;
}
int bytesSent = send(clientSocket, buffer, strlen(buffer), 0);
if (bytesSent == SOCKET_ERROR) {
std::cerr << "Send failed." << std::endl;
break;
}
int bytesReceived = recv(clientSocket, buffer, BUFFER_SIZE, 0);
if (bytesReceived <= 0) {
std::cerr << "Receive failed." << std::endl;
break;
}
buffer[bytesReceived] = '\0';
std::cout << "Received echoed message: " << buffer << std::endl;
}
closesocket(clientSocket);
WSACleanup();
return 0;
}
```
### 代码说明
- **服务器端**:使用 `WSAStartup` 初始化 Winsock 库,创建监听套接字,绑定端口并开始监听客户端连接。接受客户端连接后,循环接收客户端发送的消息,打印消息内容和长度,并将消息原样返回给客户端。
- **客户端**:同样使用 `WSAStartup` 初始化 Winsock 库,创建套接字并连接到服务器。用户输入消息后,将消息发送给服务器,接收服务器返回的回声消息并打印。
### 运行步骤
1. 分别编译服务器端和客户端代码。
2. 先运行服务器端程序,等待客户端连接。
3. 运行客户端程序,输入消息进行测试。输入 `quit` 可退出客户端程序。