1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
| #include <iostream>
#include <cstring>
#include <cstdlib>
#include <unistd.h>
#include <arpa/inet.h>
#include <pthread.h>
constexpr int BUFFER_SIZE = 1024;
constexpr int PORT = 8080;
void *handleClient(void *arg) {
int clientSocket = *((int *)arg);
char buffer[BUFFER_SIZE];
while (true) {
// 接收客户端消息
ssize_t bytesRead = recv(clientSocket, buffer, BUFFER_SIZE - 1, 0);
if (bytesRead <= 0) {
// 客户端关闭连接或发生错误
close(clientSocket);
std::cout << "Client disconnected" << std::endl;
break;
}
buffer[bytesRead] = '\0';
std::cout << "Received from client: " << buffer << std::endl;
// 原样返回消息给客户端
send(clientSocket, buffer, strlen(buffer), 0);
}
pthread_exit(NULL);
}
int main() {
// 创建服务器套接字
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == -1) {
std::cerr << "Error creating server socket" << std::endl;
exit(EXIT_FAILURE);
}
// 配置服务器地址
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)) == -1) {
std::cerr << "Error binding server socket" << std::endl;
close(serverSocket);
exit(EXIT_FAILURE);
}
// 监听连接
if (listen(serverSocket, 10) == -1) {
std::cerr << "Error listening for connections" << std::endl;
close(serverSocket);
exit(EXIT_FAILURE);
}
std::cout << "Server listening on port " << PORT << std::endl;
while (true) {
// 接受客户端连接
sockaddr_in clientAddr;
socklen_t clientAddrLen = sizeof(clientAddr);
int clientSocket = accept(serverSocket, (sockaddr *)&clientAddr, &clientAddrLen);
if (clientSocket == -1) {
std::cerr << "Error accepting client connection" << std::endl;
continue;
}
std::cout << "Client connected: " << inet_ntoa(clientAddr.sin_addr) << ":" << ntohs(clientAddr.sin_port) << std::endl;
// 创建一个新线程处理客户端请求
pthread_t thread;
if (pthread_create(&thread, NULL, handleClient, &clientSocket) != 0) {
std::cerr << "Error creating thread" << std::endl;
close(clientSocket);
} else {
pthread_detach(thread);
}
}
// 关闭服务器套接字
close(serverSocket);
return 0;
}
|