epoll.zip
大小:21.34KB
价格:43积分
下载量:0
评分:
5.0
上传者:qq_37077309
更新日期:2025-09-22

epoll实现简单聊天程序

资源文件列表(大概)

文件名
大小
u_e_cli
17.41KB
u_epoll_cli.c
2.78KB
u_epoll_ser.c
4.39KB
u_epoll_ser.cpp
4.66KB
u_e_ser
17.52KB
cpp
26.59KB
Makefile
175B

资源内容介绍

epoll实现简单聊天程序, 终端输入接收cli端数据,c 和c++ 实现ser c实现cli,c++方式支持多个客户端
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <sys/un.h>#include <sys/epoll.h>#include <fcntl.h>#define SOCKET_PATH "/tmp/chat.sock"#define BUFFER_SIZE 1024int main() { int server_socket, client_socket; struct sockaddr_un server_addr, client_addr; socklen_t client_len; int cli_fd = 0; // 创建 Unix 域套接字 server_socket = socket(AF_UNIX, SOCK_STREAM, 0); if (server_socket == -1) { perror("socket"); exit(EXIT_FAILURE); } // 清除旧的 socket 文件 unlink(SOCKET_PATH); // 准备地址结构 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sun_family = AF_UNIX; strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) - 1); // 绑定套接字 if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { perror("bind"); exit(EXIT_FAILURE); } // 开始监听 if (listen(server_socket, 1) == -1) { perror("listen"); exit(EXIT_FAILURE); } // 接受客户端连接 /*client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_len); if (client_socket == -1) { perror("accept"); exit(EXIT_FAILURE); } // 设置套接字为非阻塞模式 int flags = fcntl(client_socket, F_GETFL, 0); fcntl(client_socket, F_SETFL, flags | O_NONBLOCK);*/ char buffer[BUFFER_SIZE]; struct epoll_event events[3]; int epoll_fd = epoll_create1(0); if (epoll_fd == -1) { perror("epoll_create1"); exit(EXIT_FAILURE); } // 添加标准输入和客户端套接字到 epoll struct epoll_event event; event.events = EPOLLIN; event.data.fd = STDIN_FILENO; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, STDIN_FILENO, &event) == -1) { perror("epoll_ctl (stdin)"); exit(EXIT_FAILURE); } event.events = EPOLLIN | EPOLLET; // 边缘触发模式 event.data.fd = server_socket; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, server_socket, &event) == -1) { perror("epoll_ctl (client_socket)"); exit(EXIT_FAILURE); } while (1) { int nready = epoll_wait(epoll_fd, events, 3, -1); if (nready == -1) { perror("epoll_wait"); break; } for (int i = 0; i < nready; ++i) { if (events[i].data.fd == STDIN_FILENO) { if (fgets(buffer, BUFFER_SIZE, stdin) != NULL) { if(cli_fd != 0) write(cli_fd, buffer, strlen(buffer)); // 发送消息给客户端 } }else if (events[i].data.fd == server_socket) { printf("events[i].data.fd == server_socket accept\n"); client_len = sizeof(client_addr); client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_len); if (client_socket == -1) { perror("accept"); continue; } event.events = EPOLLIN | EPOLLET; // 边缘触发模式 event.data.fd = client_socket; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, client_socket, &event) == -1) { perror("epoll_ctl (client_socket)"); continue; } cli_fd = client_socket; }else{ //printf("enter read, events[j].data.fd = 0x%x\n", events[i].data.fd); ssize_t nread = read(events[i].data.fd, buffer, BUFFER_SIZE - 1); if (nread > 0) { buffer[nread] = '\0'; printf("Received: %s", buffer); } else if (nread == 0) { printf("Client disconnected.\n"); epoll_ctl(epoll_fd, EPOLL_CTL_DEL, events[i].data.fd, NULL); close(events[i].data.fd); cli_fd = 0; continue; } else { perror("Error reading from client"); break; } } } } // 清理 close(client_socket); close(server_socket); close(epoll_fd); unlink(SOCKET_PATH); return 0;}

用户评论 (0)

发表评论

captcha

相关资源

基于SSM实现的酒店后台管理系统(源码+数据库).zip

酒店后台管理系统简介这是一个基于SSM框架开发的精简酒店后台管理系统,旨在提供高效的住客、房间和会员信息管理功能,同时支持数据的导出下载。系统采用layui-Qadmin模板设计,整体风格简约大气,操作方便快捷,欢迎各位专业人士下载使用或进行二次开发,期待各方提出宝贵意见。安装教程安装步骤如下:1.导入至您的IDE工具中。2.配置Tomcat服务器和MySQL数据库。3.部署并运行应用程序,确保应用程序上下文路径配置为根路径"/".使用说明系统使用方法:4.打开系统后,进入登录页面进行身份验证。5.在左侧菜单中选择相应功能,如添加住客、查看房间列表等操作。部分页面截图6.登录页7.首页8.添加住客9.房间列表显示以上是对该酒店后台管理系统的简要介绍和使用说明。系统设计简洁明了,适合酒店管理人员快速有效地管理相关信息。如有任何建议或意见,请随时联系我们。

9.46MB42积分

education.zip

education

136.51KB39积分

easyPlayer视频流https://blog.csdn.net/weixin-42120669/article/deta

vue3直播视频流easy-player easyPlayer视频流 https://blog.csdn.net/weixin_42120669/article/details/140853267

5.57MB34积分

GDAL2.2.3 for Android

GDAL2.2.3 for Android使用环境: compileSdkVersion 28 buildToolsVersion '28.0.3' defaultConfig { minSdkVersion 23 targetSdkVersion 28 versionCode 3 versionName '3.0' testInstrumentationRunner"android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true }

24.59MB27积分