有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; }
解决 无用评论 打赏 举报
悬赏问题
- ¥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驱动,如何解决?