poll实现echo服务器的并发

poll实现echo服务器的并发

代码实现

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/time.h>
#include <unistd.h>
#include <sys/poll.h>#define MAX_CLI 50int clients[MAX_CLI];
struct sockaddr_in clientaddr;
socklen_t len = sizeof(clientaddr);int socket_create(int port) {//创建并绑定网络监听的socket套接字int fd;if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {perror("socket");exit(EXIT_FAILURE);}struct sockaddr_in addr;bzero(&addr, sizeof(addr));addr.sin_family = AF_INET;addr.sin_addr.s_addr = INADDR_ANY;addr.sin_port = htons(port);if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {perror("bind");exit(EXIT_FAILURE);}if (listen(fd, 20) < 0) {perror("listen");exit(EXIT_FAILURE);}return fd;
}
int recv_msg(int fd, char *buff, int size) { int rsize = recv(fd, buff, sizeof(char ) * size, 0);if (rsize <= 0) {if (rsize == 0) return 0;return -1;}printf("Recv : %s\n", buff);return 1;
}int send_msg(int fd, char *buff, int size) {int ssize = send(fd, buff, sizeof(char ) * size, 0);if (ssize <= 0) {if (ssize == 0) return 0;return -1;}printf("Send success!\n");return 1;
}void echo_work(int server_listen) {struct pollfd fds[MAX_CLI + 1];fds[0].fd = server_listen;fds[0].events = POLLIN;int max_fd = server_listen;while (1) {int ret = poll(fds, MAX_CLI + 1, -1);if (ret == -1) {perror("poll");exit(EXIT_FAILURE);}//接受连接请求if (fds[0].revents & POLLIN) {int client_fd;if ((client_fd = accept(server_listen, (struct sockaddr *)&clientaddr, &len)) < 0) {perror("accept");exit(EXIT_FAILURE);}printf("one client connect success!\n");for (int i = 0; i < MAX_CLI; i++) {if (clients[i] == -1) {clients[i] = client_fd;break;}}//更新pollfd数组for (int i = 1; i  <= MAX_CLI; i++) {if (clients[i - 1] != -1) {fds[i].fd = clients[i - 1];fds[i].events = POLLIN;max_fd = fds[i].fd > max_fd ? fds[i].fd : max_fd;}}}//检查客户端套接字是否有数据可读for (int i = 1; i <= MAX_CLI; i++) {if (fds[i].revents & POLLIN) {char buff[1024] = {0};if (recv_msg(fds[i].fd, buff, 1024) <= 0) {printf("disconnect one client  OR error!\n");close(fds[i].fd);clients[i - 1] = -1;continue;} if (send_msg(fds[i].fd, buff, 1024) <= 0) {printf("disconnect one client  OR error!\n");close(fds[i].fd);clients[i - 1] = -1;continue;} }}} return ;
}int main() {int server_listen;if ((server_listen = socket_create(8080)) < 0) {perror("socket_create");exit(EXIT_FAILURE);}for(int i = 0; i < MAX_CLI; i++) clients[i] = -1;echo_work(server_listen);return 0;
}

运行效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/1613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

@CrossOrigin的使用

CrossOrigin的使用 1.使用场景2.用法3.示例3.1 标注在方法上3.2 标注在类上 3.属性配置 1.使用场景 前后端分离应用&#xff1a;当前端应用和后端服务部署在不同的域或端口上时&#xff0c;前端应用尝试向后端服务发起请求时&#xff0c;可能会遇到同源策略的限制。这时&#…

python开发应该具备哪些能力

Python开发能力涵盖了多个方面&#xff0c;这些能力不仅涉及Python语言本身&#xff0c;还包括与Python开发相关的技术栈、工具和方法论。以下是一些关键的Python开发能力&#xff1a; Python语言基础&#xff1a; 熟练掌握Python的语法和核心特性&#xff0c;如变量、数据类型…

常用命令合集

设置永久清华源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simpleDocker dockerfile FROM nvidia/cuda:11.8.0-devel-ubuntu20.04RUN rm -rf /var/lib/apt/lists/* RUN apt-get clean RUN apt update RUN apt upgrade -yRUN apt install vim -yRU…

【JAVA】实现只有一个窗口弹出的底层逻辑——单身模式

目录 背景说明 代码实现 手写笔记 背景说明 有的时候&#xff0c;当你点击一个选项时会弹出来多个窗口&#xff0c;而有的时候只会弹出一个。 实际上&#xff0c;弹出多个窗口就是创建了多个相同的对象&#xff0c;而只弹出一个就是我们今天即将分享的单身模式——一个类只产生…

【Python】使用Python计算简单数值积分

题外话&#xff0c;Python语言命名的来源&#xff1a;&#xff08;见下图&#xff09;Monty Python巨蟒剧团 1、积分题目&#xff08;3&#xff09; 2、解析解答 3、Python计算代码 import math import scipy.integrate as integrate# 积分区间 # x_min 0.0 # 1 # x_min …

润石科技(RUNIC)汽车电子应用方案和物料选型

一、润石科技&#xff08;RUNIC&#xff09;简介 江苏润石科技有限公司是一家专注于高性能、高品质模拟/混合信号集成电路研发和销售的高科技半导体设计公司。公司主要产品线分为两类&#xff1a;信号链和电源管理&#xff0c;其中信号链包含运算放大器、比较器、模拟开关、数…

PotCSS 概述

PotCSS 并不是一个广泛认知的术语或者一个特定的技术&#xff0c;至少在提供的搜索结果中没有直接提到 PotCSS 的相关信息。因此&#xff0c;无法提供关于 PotCSS 的背景渊源介绍。 然而&#xff0c;如果你指的是 PostCSS&#xff0c;那么可以提供一些关于它的背景信息。PostC…

王者荣耀防御塔如何开发!新手小白做游戏开发采坑经过。phaser前端游戏框架

好嘞&#xff0c;游戏开发框架是js 开发的网页小游戏&#xff01; phaser这个框架。好我们先上图&#xff01; 目前大概是这么一个样子。 然后防御塔功能呢。简单的说就是当人物进去的时候打他。人物扣血。 我们的小人物是这样的代码 遇到的问题如下&#xff1b; 小白刚开始…

C++从入门到精通——模板

模板 前言一、泛型编程二、函数模板函数模板的概念函数模板格式示例 函数模板的原理函数模板的实例化隐式实例化显式实例化示例 auto做模板函数的返回值模板参数的匹配原则总结 三、类模板类模板的定义格式类模板的实例化 前言 C模板是C语言中的一种泛型编程技术&#xff0c;可…

centos 7.9 安装 ftp 传输文件

ftp server 端 sudo yum install vsftpd ftp其中 vsftpd 为 ftp server 端&#xff0c;ftp 包含 ftp 这个客户端命令。 # sudo rpm -ql vsftpd/etc/logrotate.d/vsftpd /etc/pam.d/vsftpd /etc/vsftpd /etc/vsftpd/ftpusers /etc/vsftpd/user_list /etc/vsftpd/vsftpd.conf /…

若依学习记录

1.克隆我的gitee项目地址 https://gitee.com/xuge520/ruo-yi-vue-master.git 2.前期工作&#xff08;注意&#xff1a;我的Mysql使用的是3308端口&#xff0c;数据库名是ry-vue&#xff09; 使用若依框架RuoYi前后端分离版(超详细步骤)-CSDN博客 3.使用若依代码生成 若依代…

服务器渲染技术(JSPELJSTL)

目录 前言 一.JSP 1.基本介绍 3.page指令(常用) 4.JSP三种常用脚本 4.1 声明脚本 <%! code %> 4.2 表达式脚本 <% code %> 4.3 代码脚本 <% code %> 4.4 注释 <%-- 注释 --%> 5. JSP 内置对象 5.1 基本介绍 5.2 九个内置对象 6.JSP域对象 二…

Ubuntu20.04 ISAAC SIM仿真下载使用流程

机器&#xff1a;华硕天选X2024 显卡&#xff1a;4060Ti ubuntu20.04 安装显卡驱动版本&#xff1a;525.85.05 参考&#xff1a; What Is Isaac Sim? — Omniverse IsaacSim latest documentationIsaac sim Cache 2023.2.3 did not work_isaac cache stopped-CSDN博客 Is…

shell 脚本基础练习

编写脚本 sysinfo.sh&#xff0c;显示当前主机系统信息&#xff0c;包括:主机名&#xff0c;IPv4地址&#xff0c;操作系统版本&#xff0c;内核版 本&#xff0c;CPU型号&#xff0c;内存大小&#xff0c;硬盘大小 tr命令用于替换或删除字符。 cut命令用于从文件或标准输入…

linux 安装openjdk-1.8

安装命令 yum install java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64查看安装路径 find / -name java 默认的安装路径 /usr/lib/jvm 查看到jre 以及java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64 配置环境变量 vim /etc/profile 添加的内容 export JAVA_HOME/usr/li…

每日一题:地下城游戏

恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0…

基于非线性控制策略的电力电子电路——DC-DC电路的3种滑模控制器【MATLAB/simulink】

第一种&#xff0c;滞环滑模控制器Buck电路 在滑模控制系统中&#xff0c;采用滞环技术&#xff0c;直接将切换函数转换成开关控制信号&#xff0c;滞环技术被看做一种降低系统结构的切换频率的调制方法&#xff0c;业界也把基于滞环滑模技术实现的滑模控制称为直接滑模控制技…

分类网络总结

欢迎大家订阅我的专栏一起学习共同进步&#xff0c;主要针对25届应届毕业生 祝大家早日拿到offer&#xff01; lets go http://t.csdnimg.cn/dfcH3 目录 4. 经典分类网络与发展 4.1 AlexNet 4.2 VGGNet 4.3 GoogLeNet Inception 4.4 ResNet 4.5 DenseNet 4.6 MobileN…

Python基础04-操作系统中的文件与目录操作

在与操作系统交互时&#xff0c;我们经常需要执行文件和目录的操作。Python提供了丰富的库来帮助我们完成这些任务。以下是一些常见的操作&#xff0c;以及如何使用Python代码来实现它们。 1. 导航文件路径 在不同的操作系统中&#xff0c;文件路径的格式可能不同。Python的o…

提取出图像的感兴趣区域

这是我们的原图像 将图像的数值统计后进行条形图展示 import matplotlib.pyplot as plt from PIL import Image import numpy as np# 图像路径 image_path r"D:\My Data\Figure\OIP.jpg"# 打开图像 image Image.open(image_path)# 将图像转换为numpy数组 image_ar…