未满999岁,请在家长的陪同下食用此博文
#include <iostream>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
const int PORT = 12345; // 设置服务器端口
const int BUFFER_SIZE = 1024; // 缓冲区大小
void server() {
// 初始化WinSock
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
// 创建socket
SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (serverSocket == INVALID_SOCKET) {
cout << "Failed to create server socket." << endl;
WSACleanup();
return;
}
// 绑定端口
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_port = htons(PORT);
if (bind(serverSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
cout << "Failed to bind server port." << endl;
closesocket(serverSocket);
WSACleanup();
return;
}
// 监听
if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) {
cout << "Failed to listen to server socket." << endl;
closesocket(serverSocket);
WSACleanup();
return;
}
cout << "Server started." << endl;
cout << "Waiting for player 1..." << endl;
// 等待连接
SOCKET player1Socket = accept(serverSocket, NULL, NULL);
if (player1Socket == INVALID_SOCKET) {
cout << "Failed to accept player 1 connection." << endl;
closesocket(serverSocket);
WSACleanup();
return;
}
cout << "Player 1 connected." << endl;
cout << "Waiting for player 2..." << endl;
// 等待连接
SOCKET player2Socket = accept(serverSocket, NULL, NULL);
if (player2Socket == INVALID_SOCKET) {
cout << "Failed to accept player 2 connection." << endl;
closesocket(player1Socket);
closesocket(serverSocket);
WSACleanup();
return;
}
cout << "Player 2 connected." << endl;
// 发送消息给玩家
char buffer[BUFFER_SIZE];
strcpy_s(buffer, "Game start.");
send(player1Socket, buffer, BUFFER_SIZE, 0);
send(player2Socket, buffer, BUFFER_SIZE, 0);
// 循环读取消息
while (true) {
// 从玩家1读取消息
memset(buffer, 0, BUFFER_SIZE);
int recvLen = recv(player1Socket, buffer, BUFFER_SIZE, 0);
if (recvLen > 0) {
cout << "Player 1: " << buffer << endl;
send(player2Socket, buffer, BUFFER_SIZE, 0);
}
else {
cout << "Player 1 disconnected." << endl;
break;
}
// 从玩家2读取消息
memset(buffer, 0, BUFFER_SIZE);
recvLen = recv(player2Socket, buffer, BUFFER_SIZE, 0);
if (recvLen > 0) {
cout << "Player 2: " << buffer << endl;
send(player1Socket, buffer, BUFFER_SIZE, 0);
}
else {
cout << "Player 2 disconnected." << endl;
break;
}
}
// 关闭socket
closesocket(player1Socket);
closesocket(player2Socket);
closesocket(serverSocket);
WSACleanup();
}
void client() {
// 初始化WinSock
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
// 创建socket
SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (clientSocket == INVALID_SOCKET) {
cout << "Failed to create client socket." << endl;
WSACleanup();
return;
}
// 连接服务器
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 设置为本机IP
serverAddr.sin_port = htons(PORT);
if (connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
cout << "Failed to connect to server." << endl;
closesocket(clientSocket);
WSACleanup();
return;
}
// 接收消息
char buffer[BUFFER_SIZE];
memset(buffer, 0, BUFFER_SIZE);
int recvLen = recv(clientSocket, buffer, BUFFER_SIZE, 0);
if (recvLen > 0) {
cout << buffer << endl;
}
// 循环发送消息
while (true) {
// 读取玩家输入
cin.getline(buffer, BUFFER_SIZE);
// 发送消息到服务器
send(clientSocket, buffer, BUFFER_SIZE, 0);
}
// 关闭socket
closesocket(clientSocket);
WSACleanup();
}
int main() {
char choice;
cout << "Select mode: (s)erver or (c)lient" << endl;
cin >> choice;
if (choice == 's') {
server();
}
else if (choice == 'c') {
client();
}
return 0;
}