写一个C++聊天室
下面是一个简单的C++聊天室的示例代码:
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <thread>
#include <vector>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define BUFFER_SIZE 1024
#define MAX_CLIENTS 10
std::vector<int> clientSockets;
void handleClient(int clientSocket) {
char buffer[BUFFER_SIZE];
while (true) {
memset(buffer, 0, BUFFER_SIZE);
int bytesRead = recv(clientSocket, buffer, BUFFER_SIZE, 0);
if (bytesRead <= 0) {
break;
}
std::cout << "Received message: " << buffer << std::endl;
// 广播消息给其他客户端
for (int socket : clientSockets) {
if (socket != clientSocket) {
send(socket, buffer, bytesRead, 0);
}
}
}
// 客户端断开连接时,从客户端列表中移除
auto it = std::find(clientSockets.begin(), clientSockets.end(), clientSocket);
if (it != clientSockets.end()) {
clientSockets.erase(it);
}
close(clientSocket);
}
int main() {
int serverSocket, clientSocket;
struct sockaddr_in serverAddress, clientAddress;
// 创建套接字
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == -1) {
std::cerr << "Failed to create socket." << std::endl;
return 1;
}
// 设置服务器地址
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = INADDR_ANY;
serverAddress.sin_port = htons(8888);
// 绑定套接字到服务器地址
if (bind(serverSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) == -1) {
std::cerr << "Failed to bind socket to address." << std::endl;
return 1;
}
// 监听连接请求
if (listen(serverSocket, MAX_CLIENTS) == -1) {
std::cerr << "Failed to listen for connections." << std::endl;
return 1;
}
std::cout << "Server started. Waiting for connections..." << std::endl;
// 接受连接请求并处理客户端
while (true) {
socklen_t clientAddressSize = sizeof(clientAddress);
clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddress, &clientAddressSize);
if (clientSocket == -1) {
std::cerr << "Failed to accept connection." << std::endl;
return 1;
}
std::cout << "New client connected. IP address: " << inet_ntoa(clientAddress.sin_addr) << std::endl;
// 将客户端套接字添加到客户端列表
clientSockets.push_back(clientSocket);
// 创建一个线程处理客户端消息
std::thread clientThread(handleClient, clientSocket);
clientThread.detach();
}
close(serverSocket);
return 0;
}
这是一个简单的多线程聊天室服务器代码。它创建一个服务器套接字,绑定到本地地址,并监听连接请求。当有客户端连接时,会创建一个新的线程来处理客户端的消息。
服务器接收客户端发送的消息,并将其广播给其他已连接的客户端。当客户端断开连接时,会从客户端列表中移除该客户端。
请注意,此代码仅为示例,可能不具备完整的错误处理和安全性。在实际应用中,可能需要添加更多的错误处理和安全性措施
原文地址: http://www.cveoy.top/t/topic/h709 著作权归作者所有。请勿转载和采集!