目录
基于多线程的服务端通信
javascript
#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <cstring>
#define PORT 8080
#define BACKLOG 5
#define BUFFER_SIZE 1024
std::mutex mtx;
void handleClient(int clientSocket) {
char buffer[BUFFER_SIZE];
while (true) {
memset(buffer, 0, sizeof(buffer));
ssize_t bytesRead = recv(clientSocket, buffer, sizeof(buffer) - 1, 0);
if (bytesRead <= 0) {
if (bytesRead == 0) {
std::lock_guard<std::mutex> lock(mtx);
std::cout << "Client disconnected" << std::endl;
} else {
std::lock_guard<std::mutex> lock(mtx);
std::cerr << "Receive error" << std::endl;
}
close(clientSocket);
break;
}
buffer[bytesRead] = '\0';
std::lock_guard<std::mutex> lock(mtx);
std::cout << "Received from client: " << buffer << std::endl;
}
}
int main() {
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket < 0) {
std::cerr << "Socket creation failed" << std::endl;
return -1;
}
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)) < 0) {
std::cerr << "Bind failed" << std::endl;
close(serverSocket);
return -1;
}
if (listen(serverSocket, BACKLOG) < 0) {
std::cerr << "Listen failed" << std::endl;
close(serverSocket);
return -1;
}
std::vector<std::thread> threads;
while (true) {
sockaddr_in clientAddr;
socklen_t clientAddrLen = sizeof(clientAddr);
int clientSocket = accept(serverSocket, (sockaddr *)&clientAddr, &clientAddrLen);
if (clientSocket < 0) {
std::cerr << "Accept failed" << std::endl;
continue;
}
threads.emplace_back(handleClient, clientSocket);
// 分离线程,避免线程对象生命周期结束时等待线程完成
threads.back().detach();
}
// 这里不会执行到,因为上面是无限循环
close(serverSocket);
return 0;
}