当前位置: 首页 > news >正文

select的缺点;poll ;poll的缺点;epoll

1.select的缺点:
    1.select监听的文件描述符集合是一个数组,有上限(1024个)
    2.select监听的文件描述符集合在应用层,内核层监听事件后需要传递给用户层带来资源开销
    3.select需要用户手动查找产生事件的文件描述符
    4.select只能工作在水平触发模式(低速模式)而无法工作在边沿触发模式(高速模式)

2.poll 
    int poll(struct pollfd *fds, nfds_t nfds, int timeout);
    功能:
        监听文件描述符集合,工作方式类似于select 
    参数:
        fds:文件描述符集合首地址
        nfds:文件描述符集合的数组的长度 
        timeout:超时时间,单位毫秒,-1表示永久等待
    返回值:
        成功返回产生事件文件描述符个数 
        失败返回-1 
        超时仍然没有产生的事件返回0 
    
    struct pollfd {
        int   fd;         /* file descriptor */
        short events;     /* requested events */
        short revents;    /* returned events */
    };

read.c

#include "head.h"int main(void)
{int fd = 0;char tmpbuff[4096] = {0};struct pollfd fds[2];int nready = 0;mkfifo("/tmp/myfifo", 0777);fd = open("/tmp/myfifo", O_RDONLY);if (-1 == fd){perror("fail to open");return -1;}fds[0].fd = fd;                     //要监听的文件描述符fds[0].events = POLLIN;             //要监听的事件fds[1].fd = 0;fds[1].events = POLLIN;while (1){nready = poll(fds, 2, -1);if (-1 == nready){perror("fail to poll");return -1;}if (fds[0].revents & POLLIN){memset(tmpbuff, 0, sizeof(tmpbuff));read(fd, tmpbuff, sizeof(tmpbuff));printf("FIFO:%s\n", tmpbuff);}if (fds[1].revents & POLLIN){memset(tmpbuff, 0, sizeof(tmpbuff));gets(tmpbuff);printf("STDIN:%s\n", tmpbuff);}}close(fd);return 0;
}


    1.poll的缺点:
        1.poll监听的文件描述符集合在应用层,内核层监听事件后需要传递给用户层带来资源开销
        2.poll需要用户手动查找产生事件的文件描述符
        3.poll只能工作在水平触发模式(低速模式)而无法工作在边沿触发模式(高速模式)

3.epoll
    1.epoll_create
      int epoll_create(int size);
      功能:
        在内核层创建一张epoll监听的事件表
      参数:
        size:监听的事件表大小
      返回值: 
        成功返回新的文件描述符
        失败返回-1

    2.epoll_ctl 
      int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
      功能:
        管理内核中epoll事件表
      参数:
        epfd:文件描述符 
        op: EPOLL_CTL_ADD   添加客户端 
            EPOLL_CTL_MOD   修改客户端 
            EPOLL_CTL_DEL   删除客户端
        fd:文件描述符 
        event:事件结构体
      返回值:
        成功返回0 
        失败返回-1

    typedef union epoll_data {
        void        *ptr;
        int          fd;
        uint32_t     u32;
        uint64_t     u64;
    } epoll_data_t;

    struct epoll_event {
        uint32_t     events;      /* Epoll events */
        epoll_data_t data;        /* User data variable */
    };  

    events:EPOLLIN  EPOLLOUT  EPOLLET  
    
    3.epoll_wait    
      int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
      功能:
        监听epfd对应的事件表中是否有事件发生 
      参数: 
        epfd:文件描述符 
        events:存放产生事件的数组空间首地址
        maxevents:最多存放数组元素个数 
        timeout:超时时间,单位毫秒,-1表示永久等待
      返回值:
        成功返回实际发生事件的个数
        失败返回-1 
        超时仍然没有产生事件返回0

#include "head.h"int main(void)
{   int epfd = 0;int fd = 0;int ret = 0;char tmpbuff[4096] = {0};struct epoll_event env;struct epoll_event retenv[2]; int nready = 0;int i = 0;mkfifo("/tmp/myfifo", 0777);fd = open("/tmp/myfifo", O_RDONLY);if (-1 == fd){perror("fail to open");return -1;}//创建一张内核监听的事件表epfd = epoll_create(2);if (-1 == epfd){perror("fail to epoll_create");return -1;}//将fd文件描述符加入事件表中env.events = EPOLLIN;env.data.fd = fd;ret = epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &env);if (-1 == ret){perror("fail to epoll_ctl");return -1;}//将0文件描述符加入事件表中env.events = EPOLLIN;env.data.fd = 0;ret = epoll_ctl(epfd, EPOLL_CTL_ADD, 0, &env);if (-1 == ret){perror("fail to epoll_ctl");return -1;}while (1){   nready = epoll_wait(epfd, retenv, 2, -1);if (-1 == nready){perror("fail to epoll_wait");return -1;}for (i = 0; i < nready; i++){if (retenv[i].data.fd == fd){memset(tmpbuff, 0, sizeof(tmpbuff));read(fd, tmpbuff, sizeof(tmpbuff));printf("FIFO:%s\n", tmpbuff);}else if (retenv[i].data.fd == 0){memset(tmpbuff, 0, sizeof(tmpbuff));gets(tmpbuff);printf("STDIN:%s\n", tmpbuff);}}   }close(epfd);return 0;
}


    epoll的优点:
        1.epoll没有文件描述符上限限制 
        2.epoll监听的事件表在内核层,内核监听事件不需要操作用户层空间提高效率
        3.epoll会获得产生事件的文件描述符,不需要用户查找
        4.epoll可以工作在边沿触发模式(高速模式),提高效率

1.编写客户端和服务端实现基于UDP的聊天室:
    客户端:
        1.允许用户输入昵称
        2.可以向服务端发送登录消息
        3.可以向服务器发送退出消息
        4.可以向服务器发送聊天消息

    服务端: 
        1.接收所有客户端的登录消息
        2.接收所有客户端的退出消息
        3.能够转发所有客户端的聊天消息

2.实现一个基于TCP的单词查询系统:
    dict.txt文件 

    1.编写客户端允许注册、注销、登录到服务器中
    2.登录成功后,客户端可以发送给服务器一个单词,并获得单词的含义
    3.客户端允许向服务器发送获得历史单词信息

    1.服务器响应注册、注销、登录一系列功能
    2.服务器响应客户端单词查询和历史搜索单词功能
    3.服务器需要支持TCP并发模型,支持多用户的并发请求

//服务端代码
#include "head.h"int main(int argc, char const *argv[])
{struct sockaddr_in seraddr;bzero(&seraddr, sizeof(seraddr));int sockfd = socket(AF_INET, SOCK_STREAM, 0);if(-1 == sockfd){perror("fail to socket");return -1;}seraddr.sin_family = AF_INET;seraddr.sin_port = htons(50000);seraddr.sin_addr.s_addr = INADDR_ANY;int bret = bind(sockfd, (SA)&seraddr, sizeof(seraddr));if(-1 == bret){perror("fail to bind");return -1;}int lret = listen(sockfd, 10);if(-1 == lret){perror("fail to listen");return -1;}int serfd = accept(sockfd, NULL, NULL);if(-1 == serfd){perror("fail to accept");return -1;}FILE *fp = fopen("dict.txt", "r");if(fp == NULL){perror("fail to fopen");return -1;}char word[128] = {0};char summar[1024] = {0};while(1){memset(word, 0, sizeof(word));fseek(fp, 0, SEEK_SET);recv(serfd, word, sizeof(word), 0);printf("%s\n", word);if(!strcmp(word, "#quit")){break;}while(1){memset(summar, 0, sizeof(summar));char *psum = summar;char *pret = fgets(summar, sizeof(summar), fp);if(!strncmp(word, summar, strlen(word))){psum += strlen(word);while(*psum == ' '){psum++;}send(serfd, psum, strlen(psum), 0);break;}if(NULL == pret){char fail[64] = "please enter a correct word, or you can quit!\n";send(serfd, fail, strlen(fail), 0);break;}}}fclose(fp);close(sockfd);close(serfd);return 0;
}
//客户端代码
#include "head.h"int main(int argc, char const *argv[])
{struct sockaddr_in seraddr;bzero(&seraddr, sizeof(seraddr));int sockfd = socket(AF_INET, SOCK_STREAM, 0);if(-1 == sockfd){perror("fail to socket");return -1;}seraddr.sin_family = AF_INET;seraddr.sin_port = htons(50000);seraddr.sin_addr.s_addr = inet_addr("192.168.0.185");int conn = connect(sockfd, (SA)&seraddr, sizeof(seraddr));if(-1 == conn){perror("fail to connect");return -1;}char word[128] = {0};char mean[1024] = {0};while(1){memset(word, 0, sizeof(word));memset(mean, 0, sizeof(mean));printf("enter a word:");scanf("%s", word);if(!strcmp(word, "#quit")){break;}send(sockfd, word, strlen(word), 0);recv(sockfd, mean, sizeof(mean), 0);printf("%s", mean);}close(sockfd);return 0;
}
//头文件
#ifndef _HEAD_H_
#define _HEAD_H_#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>#endif

相关文章:

select的缺点;poll ;poll的缺点;epoll

1.select的缺点&#xff1a; 1.select监听的文件描述符集合是一个数组&#xff0c;有上限&#xff08;1024个&#xff09; 2.select监听的文件描述符集合在应用层&#xff0c;内核层监听事件后需要传递给用户层带来资源开销 3.select需要用户手动查找产生事件的文件…...

keli5_报错 Cannot Load Device Description问题

1原因 之前创建的keli5的项目软件版本与当前的软件版本不同 使其算法要重新选择 2解决方法 2-1 点击图中的魔术棒 2-2 在这个界面中进入 Settings选项&#xff08;ST-Link Debugger 旁边&#xff09; 2-3 点击Flash Download 选项进入图中界面 在点击天加 2-4选择fla…...

算法的学习笔记—把二叉树打印成多行(牛客JZ78)

&#x1f600;前言 在算法面试中&#xff0c;二叉树的层序遍历是一个经典的题目。而这道题的要求是进一步将二叉树的每一层结点值打印成多行&#xff0c;即同一层结点从左至右输出&#xff0c;最终结果存放到一个二维数组中返回。接下来&#xff0c;我们将通过代码实例详细解析…...

FreeRTOS 时间管理

延时函数介绍 函数 描述 vTaskDelay() 相对延时 xTaskDelayUntil() 绝对延时 相对延时&#xff1a;指每次延时都是从执行函数vTaskDelay()开始&#xff0c;直到延时指定的时间结束 绝对延时&#xff1a;指将整个任务的运行周期看成一个整体&#xff0c;适用于需要按…...

F. Valuable Cards D. Smithing Skill

D题 F题 F题&#xff1a; 因为是连续的且都要选&#xff0c;我们直接从左到右去取每个区间到不合法的情况即可&#xff0c;可以在n1的位置添加一个x来结束区间判断。因为是要乘积为x&#xff0c;那么我们只需要放x的因子进去&#xff0c;不然会超时&#xff0c;同时也可以用v…...

【电子通识】IPC-A-600中对验收标准的定义

在文章【电子通识】IPC-A-610标准对产品的四种验收条件都是什么意思&#xff1f;中我们讲到IPC-A-610标准&#xff08;电子组件的可接受性&#xff09;对于产品的四种验收条件。本文中我们同理讲一讲IPC-A-600中对验收标准的定义。 IPC-A-600文件中的多数示意图和照片同时表示每…...

MyBatis(初阶)

1.什么是MyBtis MyBatis是持久层框架&#xff0c;⽤于简化JDBC的开发。 2.准备工作 2.1 创建⼯程 数据库: 2.2 配置数据库连接字符串 以application.yml⽂件为例: 2.3 写持久层代码 Data public class UserInfo {private Integer id;private String username;private Stri…...

KDP数据平台:以实战案例验证技术领先力

本文由智领云 LeetTools 工具自动生成 申请试用&#xff1a; https://www.leettools.com/feedback/ 在当今快速发展的技术环境中&#xff0c;数据平台的选择对企业的数字化转型和业务发展至关重要。智领云开源KDP&#xff08;Kubernetes Data Platform&#xff09;在数据处理和…...

[Linux] 什么是 Shell?

一、什么是 shell ? shell在英语中的意思就是外壳&#xff0c;所以我们习惯称shell程序为壳程序。那为什么又会被叫做壳程序呢&#xff1f;那是因为shell程序是在内核上面的&#xff0c;属于操作系统的外壳部分&#xff0c;因此我们就称之为壳程序(shell)。 在 Linux 中&#…...

大模型学习应用 2:快速上手大模型基于langchain实现RAG检索应用

快速上手大模型基于langchain实现RAG检索应用 - 项目作业 目录 准备工作镜像选择算力选择安装包数据说明提示参考链接 Task1 申请 api 后&#xff0c;使用 langchain 导入大模型&#xff0c;并打印出大模型信息Task2 使用 langchian 加载数据&#xff0c;并把数据打印出来Task…...

python环境安装之后,cmd输入python回车会打开微软商店

坑爹&#xff01;python环境安装之后&#xff0c;cmd输入python回车会打开微软商店 最近发现&#xff0c;安装python环境成功之后&#xff0c;可能会出现cmd输入python验证是否安装成功老会打开微软商店&#xff01; 解决&#xff0c;打开系统环境配置&#xff0c;找到刚安装…...

USB Type-C如何取9V、12V、15V、20V电压-PD快充协议芯片ECP5701

相信大家在生活中也发现了&#xff0c;现在越来越多的设备都改用这种type-C接口的母座进行取电了。 因为欧盟决议 &#xff1a;自2024年起部分消费电子产品必须提供单一的USB-C充电接口。 那么这种type-C接口相比之前的Micro-B接口有着一个很大的优势就是可以有更高的电压&…...

Go 语言 Map 17

Go 语言提供了一个强大的 Map 结构体&#xff0c;用于存储键值对。Map 可以用来存储数据&#xff0c;快速查找和修改数据。下面是 Go 语言 Map 的使用教程。 什么是 Map&#xff1f; Map 是一个键值对的集合&#xff0c;它可以存储任意类型的键和值。Map 中的每个键都是唯一的…...

移植bash到openharmony

1.交叉工具链 下载地址&#xff1a; http://ci.openharmony.cn/workbench/cicd/dailybuild/dailylist 进入ohos-sdk-full&#xff0c;下载一个sdk版本&#xff0c;这里下载的版本是version-Master_Version-OpenHarmony_5.0.0.35-20240805_020232-ohos-sdk-full.tar.gz。 解…...

git stash详细教程

git stash详细教程 基本命令: git stash: 保存当前未提交的更改&#xff0c;并恢复到干净的工作目录。git stash list: 列出所有的 stash。git stash show: 显示最新 stash 的简要内容。git stash show -p: 显示最新 stash 的详细内容。 应用和删除: git stash apply: 应用最新…...

UDP网络攻击

UDP&#xff08;User Datagram Protocol&#xff09;作为一种无连接的网络传输协议&#xff0c;以其速度快和资源消耗小的特点&#xff0c;在多种网络服务中发挥着重要作用&#xff0c;UDP的无连接特性也使其成为DDoS攻击的优选协议。 UDP攻击概念 UDP攻击是一种网络攻击手段…...

漏洞扫描的重要性,如何做好漏洞扫描服务

随着互联网技术的飞速发展&#xff0c;网络安全问题已成为不容忽视的重大挑战。其中&#xff0c;系统漏洞威胁作为最常见且严重的安全危险之一&#xff0c;对组织和个人的信息资产构成了巨大威胁。下面我们就来了解下漏洞扫描的好处、漏洞扫描的操作方法以及如何做好网络安全。…...

unity程序简易框架

1. 框架基本结构 2. 单例模式基类模块 2.1 BaseManager.cs using System.Collections; using System.Collections.Generic; using UnityEngine;public class BaseManager<T> where T:new() {private static T instance;public static T GetInstance(){if (instance == …...

Go小技巧易错点100例(十六)

本期看点&#xff1a; 正文开始&#xff1a; 切片的长度和容量 在Go语言中&#xff0c;切片&#xff08;slice&#xff09;是一个引用类型&#xff0c;它是对底层数组的抽象表示&#xff0c;提供了动态长度的、灵活的序列类型。切片包含三个重要的属性&#xff1a;指向底层数…...

通过Golang实现中间人攻击,查看和修改https流量包

要查看和修改 HTTPS 流量包&#xff0c;需要使用一个能够执行 中间人攻击&#xff08;Man-in-the-Middle, MITM&#xff09; 的代理工具。这个工具将拦截并解密 HTTPS 流量&#xff0c;然后允许查看和修改流量包的内容&#xff0c;再将其重新加密并发送到目标服务器。 完整的 …...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...