有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; }解决 无用评论 打赏 举报