下面是一个简单的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;
}

这是一个简单的多线程聊天室服务器代码。它创建一个服务器套接字,绑定到本地地址,并监听连接请求。当有客户端连接时,会创建一个新的线程来处理客户端的消息。

服务器接收客户端发送的消息,并将其广播给其他已连接的客户端。当客户端断开连接时,会从客户端列表中移除该客户端。

请注意,此代码仅为示例,可能不具备完整的错误处理和安全性。在实际应用中,可能需要添加更多的错误处理和安全性措施

写一个C++聊天室

原文地址: http://www.cveoy.top/t/topic/h709 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录