2401_85689923 2024-08-05 18:09 采纳率: 0%
浏览 17

刚开始学c语言,不会写

有abc三个client,给他标记id,每一个client可以指定发送消息给任意一个client,c语言,这个服务端代码如何写

  • 写回答

1条回答 默认 最新

  • CSDN专家-微编程 2024-08-06 07:21
    关注

    以下是一个用C语言编写的简单的服务器代码,可以处理来自三个客户端的消息,并相应地将消息发送给指定的客户端。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <pthread.h>
    
    #define MAX_CLIENTS 3
    
    int clients[MAX_CLIENTS];
    pthread_t threads[MAX_CLIENTS];
    int active_clients = 0;
    
    typedef struct {
        int client_id;
        char message[256];
    } Message;
    
    // 处理客户端消息的线程函数
    void* handle_client(void* arg) {
        int client_id = *((int*) arg);
        int client_socket = clients[client_id];
        Message message;
    
        while (1) {
            memset(&message, 0, sizeof(Message));
    
            // 从客户端接收消息
            ssize_t bytes_received = recv(client_socket, &message, sizeof(Message), 0);
            if (bytes_received <= 0) {
                // 客户端断开连接
                break;
            }
    
            // 查找指定接收者的客户端
            int recipient_id = message.client_id;
            int recipient_socket = clients[recipient_id];
    
            // 发送消息给指定的客户端
            ssize_t bytes_sent = send(recipient_socket, &message, sizeof(Message), 0);
            if (bytes_sent <= 0) {
                // 发送失败,可能客户端断开连接或出现错误
                break;
            }
        }
    
        // 关闭客户端连接
        close(client_socket);
        clients[client_id] = 0;
        active_clients--;
    
        return NULL;
    }
    
    int main() {
        int server_socket, client_socket;
        struct sockaddr_in server_address, client_address;
        socklen_t client_address_length = sizeof(client_address);
    
        // 创建服务器socket
        server_socket = socket(AF_INET, SOCK_STREAM, 0);
        if (server_socket < 0) {
            perror("Failed to create socket");
            exit(1);
        }
    
        // 设置服务器地址
        server_address.sin_family = AF_INET;
        server_address.sin_port = htons(8888);
        server_address.sin_addr.s_addr = INADDR_ANY;
    
        // 绑定服务器socket到指定地址和端口
        if (bind(server_socket, (struct sockaddr*) &server_address, sizeof(server_address)) < 0) {
            perror("Failed to bind socket");
            exit(1);
        }
    
        // 监听客户端连接
        if (listen(server_socket, 3) < 0) {
            perror("Failed to listen for connections");
            exit(1);
        }
    
        printf("Server started. Waiting for clients...\n");
    
        // 等待客户端连接
        while (active_clients < MAX_CLIENTS) {
            // 接受客户端连接
            client_socket = accept(server_socket, (struct sockaddr*) &client_address, &client_address_length);
            if (client_socket < 0) {
                perror("Failed to accept connection");
                exit(1);
            }
    
            // 在clients数组中找到一个空闲位置
            int client_id = 0;
            while (clients[client_id] != 0) {
                client_id++;
            }
    
            // 将新的客户端socket保存在clients数组中
            clients[client_id] = client_socket;
            active_clients++;
    
            // 创建新的线程来处理客户端消息
            if (pthread_create(&threads[client_id], NULL, handle_client, &client_id) != 0) {
                perror("Failed to create thread");
                exit(1);
            }
    
            printf("Client %d connected\n", client_id);
        }
    
        // 等待所有客户端线程结束
        for (int i = 0; i < MAX_CLIENTS; i++) {
            if (threads[i]) {
                pthread_join(threads[i], NULL);
            }
        }
    
        // 关闭服务器socket
        close(server_socket);
    
        return 0;
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 8月5日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?