“从 Talk 程序“ 关联用户现有使用场景,体现学习路径

目录

在阿里云服务器上登录后,运行talk程序与其他用户进行文字聊天。

用c语言写一个linux进程之间通信(聊天)的简单程序(可请教deepseek),建议先使用IPC或消息管道、消息槽等模式.

1. 服务器端代码 (talk_server.c)

2. 客户端代码 (talk_client.c) 

编译和运行

编译

运行

每个用户运行一个客户端即可,运行结果


 

在阿里云服务器上登录后,运行talk程序与其他用户进行文字聊天。

用c语言写一个linux进程之间通信(聊天)的简单程序(可请教deepseek),建议先使用IPC或消息管道、消息槽等模式.

1. 服务器端代码 (talk_server.c)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <pthread.h>

#define PORT 9999
#define MAX_CLIENTS 10
#define BUFFER_SIZE 1024

int client_sockets[MAX_CLIENTS];
int client_count = 0;

// 处理客户端消息的函数
void *handle_client(void *arg) {
    int client_socket = *((int *)arg);
    char buffer[BUFFER_SIZE];

    while (1) {
        int bytes_received = recv(client_socket, buffer, BUFFER_SIZE, 0);
        if (bytes_received <= 0) {
            break;
        }

        buffer[bytes_received] = '\0';
        printf("Received: %s", buffer);

        // 广播消息给所有其他客户端
        for (int i = 0; i < client_count; i++) {
            if (client_sockets[i] != client_socket) {
                send(client_sockets[i], buffer, strlen(buffer), 0);
            }
        }
    }

    // 移除断开的客户端
    for (int i = 0; i < client_count; i++) {
        if (client_sockets[i] == client_socket) {
            for (int j = i; j < client_count - 1; j++) {
                client_sockets[j] = client_sockets[j + 1];
            }
            client_count--;
            break;
        }
    }

    close(client_socket);
    free(arg);
    return NULL;
}

int main() {
    int server_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (server_socket == -1) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }

    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(PORT);

    if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
        perror("Bind failed");
        close(server_socket);
        exit(EXIT_FAILURE);
    }

    if (listen(server_socket, MAX_CLIENTS) == -1) {
        perror("Listen failed");
        close(server_socket);
        exit(EXIT_FAILURE);
    }

    printf("Server started on port %d. Waiting for connections...\n", PORT);

    while (1) {
        struct sockaddr_in client_addr;
        socklen_t client_len = sizeof(client_addr);
        int client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_len);

        if (client_socket == -1) {
            perror("Accept failed");
            continue;
        }

        printf("Accepted connection from %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

        // 添加客户端到列表
        if (client_count < MAX_CLIENTS) {
            client_sockets[client_count++] = client_socket;

            // 创建线程处理客户端
            pthread_t thread;
            int *client_socket_ptr = malloc(sizeof(int));
            *client_socket_ptr = client_socket;
            pthread_create(&thread, NULL, handle_client, client_socket_ptr);
            pthread_detach(thread);
        } else {
            printf("Too many clients. Closing connection.\n");
            close(client_socket);
        }
    }

    close(server_socket);
    return 0;
}

2. 客户端代码 (talk_client.c

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <pthread.h>

#define PORT 9999
#define BUFFER_SIZE 1024

int client_socket;

// 接收消息的线程
void *receive_messages(void *arg) {
    char buffer[BUFFER_SIZE];
    while (1) {
        int bytes_received = recv(client_socket, buffer, BUFFER_SIZE, 0);
        if (bytes_received <= 0) {
            printf("Connection closed by server.\n");
            break;
        }
        buffer[bytes_received] = '\0';
        printf("\rReceived: %s\nYou: ", buffer);
        fflush(stdout);
    }
    return NULL;
}

// 发送消息的线程
void *send_messages(void *arg) {
    char buffer[BUFFER_SIZE];
    while (1) {
        printf("You: ");
        fflush(stdout);
        fgets(buffer, BUFFER_SIZE, stdin);

        // 去掉换行符
        buffer[strcspn(buffer, "\n")] = '\0';

        if (strcmp(buffer, "exit") == 0) {
            break;
        }

        send(client_socket, buffer, strlen(buffer), 0);
    }
    return NULL;
}

int main() {
    client_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (client_socket == -1) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }

    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    server_addr.sin_port = htons(PORT);

    if (connect(client_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
        perror("Connection failed");
        close(client_socket);
        exit(EXIT_FAILURE);
    }

    printf("Connected to the server. Type 'exit' to quit.\n");

    pthread_t receive_thread, send_thread;
    pthread_create(&receive_thread, NULL, receive_messages, NULL);
    pthread_create(&send_thread, NULL, send_messages, NULL);

    pthread_join(receive_thread, NULL);
    pthread_join(send_thread, NULL);

    close(client_socket);
    return 0;
}

编译和运行

编译

  1. 编译服务器端:

    gcc talk_server.c -o talk_server -lpthread
  2. 编译客户端:

    gcc talk_client.c -o talk_client -lpthread

    运行

  3. 启动服务器:

    ./talk_server
  4. 启动客户端(在新的终端中):

./talk_client

     

    1. 每个用户运行一个客户端即可,运行结果

     

     

     

     

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值