Linux 非阻塞网络IO模式

非阻塞网络IO模式介绍

当用户线程发起一个 read 操作后,并不需要等待,而是马上就得到了一个结果。如果结果是一个 error 时,它就知道数据还没有准备好,于是它可以再次发送 read 操作。一旦内核中的数据准备好了,并且又再次收到了用户线程的请求,那么它马上就将数据拷贝到了用户线程,然后返回。

所以事实上,在非阻塞 IO 模型中,用户线程需要不断地询问内核数据是否就绪,也就 说非阻塞 IO 不会交出 CPU,而会一直占用 CPU。

在这里插入图片描述

设置非阻塞常用方式:

方式一: 创建 socket 时指定

int s = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, IPPROTO_TCP);

方式二: 在使用前通过如下方式设定

fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFL, 0) | O_NONBLOCK);

方式一 demo

#include <sys/un.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>

#define BUFF_SIZE 1024

int main(void)
{
        int server_sockfd;
        int client_sockfd;
        char ch;
        int ret;
        int recv_len;
        char buff[BUFF_SIZE];
        //用于 UNIX 系统内部通信的地址, struct sockaddr_un
        struct sockaddr_in server_addr;
        struct sockaddr_in client_addr;

        int client_addr_len =sizeof(struct sockaddr_in);
        server_sockfd = socket(AF_INET, SOCK_DGRAM|SOCK_NONBLOCK, 0);
        // 设置服务器地址
        server_addr.sin_family = AF_INET;               //地址的域,相当于地址的类型,AF_UNIX 表示地址位于 UNIX 系统内部
        server_addr.sin_addr.s_addr = INADDR_ANY;       //inet_addr("10.10.0.9");
        server_addr.sin_port = htons(9000);
        // 绑定该套接字,使得该套接字和对应的系统套接字文件关联起来。
        ret = bind(server_sockfd, (struct sockaddr*)&server_addr,sizeof(server_addr));

        if (ret == -1) {
                perror("bind");
                exit(1);
        }
        // 创建套接字队列, 保存进入该服务器的客户端请求。
        // ret = listen(server_sockfd, 5);
        // 循环处理客户端请求
        while (1) {
                printf("server waiting\n");
                // 等待并接收客户端请求
                //client_sockfd = accept(server_sockfd, (struct sockaddr*)&client_addr, &client_addr_len);
                recv_len = recvfrom(server_sockfd, buff, sizeof(buff) , 0,(struct sockaddr*)&client_addr, &client_addr_len);
                if (recv_len < 0) {
                        if(errno == EAGAIN ||errno == EWOULDBLOCK){
                                sleep(2);
                                continue;
                        }
                        perror("recvfrom");
                        exit(errno);
                }
                printf("received: %s\n", buff);
        }
        close(server_sockfd);
        return 0;
}

在这里插入图片描述
方式二 demo

#include <sys/un.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>

#define BUFF_SIZE 1024

int main(void)
{
        int server_sockfd;
        int client_sockfd;
        char ch;
        int ret;
        int recv_len;
        char buff[BUFF_SIZE];
        //用于 UNIX 系统内部通信的地址, struct sockaddr_un
        struct sockaddr_in server_addr;
        struct sockaddr_in client_addr;

        int client_addr_len =sizeof(struct sockaddr_in);
        server_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
        // 设置服务器地址
        server_addr.sin_family = AF_INET;               //地址的域,相当于地址的类型,AF_UNIX 表示地址位于 UNIX 系统内部
        server_addr.sin_addr.s_addr = INADDR_ANY;       //inet_addr("10.10.0.9");
        server_addr.sin_port = htons(9000);
        // 绑定该套接字,使得该套接字和对应的系统套接字文件关联起来。
        ret = bind(server_sockfd, (struct sockaddr*)&server_addr,sizeof(server_addr));

        if (ret == -1) {
                perror("bind");
                exit(1);
        }
        // 创建套接字队列, 保存进入该服务器的客户端请求。
        // ret = listen(server_sockfd, 5);


        fcntl(server_sockfd, F_SETFL, fcntl(server_sockfd, F_GETFL, 0) | O_NONBLOCK);
        // 循环处理客户端请求
        while (1) {
                printf("server waiting\n");
                // 等待并接收客户端请求
                //client_sockfd = accept(server_sockfd, (struct sockaddr*)&client_addr, &client_addr_len);
                recv_len = recvfrom(server_sockfd, buff, sizeof(buff) , 0,(struct sockaddr*)&client_addr, &client_addr_len);
                if (recv_len < 0) {
                        if(errno == EAGAIN ||errno == EWOULDBLOCK){
                                sleep(2);
                                continue;
                        }
                        perror("recvfrom");
                        exit(errno);
                }
                printf("received: %s\n", buff);
        }
        close(server_sockfd);
        return 0;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何用CHAT写启发感想

问CHAT&#xff1a;写篇劳动教育课程给我带来的启发和影响 CHAT回复&#xff1a;自从我参加了学校的劳动教育课程&#xff0c;我深深地意识到劳动的重要性。这门课程通过让我们体验和认识各种劳动形式&#xff0c;提醒我去珍惜每一份来之不易的成果。接下来我想分享几个显著的观…

IntelliJ IDEA无公网环境远程访问Linux服务器进行开发

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境&#xff0c;并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

C++数据类型以及函数设计学习记录

一、C类型转换原则 当表达式中出现了多种类型数据的混合运算时&#xff0c;往往需要进行类型转换。表达式中的类型转换分为两种&#xff1a;隐式转换和显式转换&#xff0c;但此处仅对隐式转换进行总结。 隐式转换分为算术转换和其它隐式类型转换两大类&#xff0c;其它隐式类型…

智慧港口解决方案:PPT全文69页,附下载

关键词&#xff1a;智慧港口解决方案&#xff0c;数字化港口&#xff0c;智慧港口发展现状与展望&#xff0c;智慧码头&#xff0c;智慧港口发展趋势 一、智慧港口建设背景 随着数字经济、智慧交通发展&#xff0c;强调“要大力发展智慧交通和智慧物流”“努力打造世界一流的…

京东方将取代三星显示,引领可折叠面板市场 | 百能云芯

在智能手机市场蓬勃扩张的浪潮中&#xff0c;中国面板制造巨头京东方将在2023年第4季超越三星显示&#xff0c;引领可折叠面板市场。 据市调公司DSCC数据显示&#xff0c;今年下半年&#xff0c;原本独占鳌头的三星电子在可折叠手机市场的份额将从去年同期的86%降至72%&#xf…

一些好用的VSCode扩展

可以在扩展这里直接搜索需要的扩展&#xff0c;点击安装即可。 1.Chinese 中文扩展&#xff0c;就是说虽然咱们懂点英语&#xff0c;但还是中文看着方便 2.Auto Rename Tag 当你重命名一个HTML 标签时&#xff0c;会自动重命名与他配对的HTML 标签 当你选择h4这个标签时&…

PPT插件-好用的插件-放映笔、绘图板-大珩助手

放映笔 幻灯片放映时&#xff0c;工具在幻灯片的左下方&#xff0c;本工具在幻灯片的右侧&#xff0c;可以移动&#xff0c;可以方便在右侧讲课时候使用 绘图板 可在绘图板上写签名、绘制图画、写字等等&#xff0c;点画笔切换橡皮擦&#xff0c;点插入绘图&#xff0c;将背景…

用什么样的开源流程表单实现办公流程化?

近日&#xff0c;有不少热心网友询问道&#xff1a;如果要实现流程化办公&#xff0c;让整个办公效率火速提升上来&#xff0c;可以用什么样的开源流程表单工具&#xff1f;大伙都知道&#xff0c;随着低代码开发平台的盛行&#xff0c;办公效率也得到很大的提升&#xff0c;它…

【LeetCode: 2415. 反转二叉树的奇数层 | BFS + DFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

针对基于nohup后台运行PyTorch多卡并行程序中断问题的一种新方法

针对基于nohup后台运行PyTorch多卡并行程序中断问题的一种新方法 文章目录 针对基于nohup后台运行PyTorch多卡并行程序中断问题的一种新方法Abstractscreen和tmux介绍tmux常用命令以及快捷键Byobu简单操作步骤集锦参考文献 Abstract PyTorch多卡并行运行程序is one of the mos…

西科大微机原理实验四(定时器程序设计)

任务一、 按实验要求内容新建一个ASM41.ASM文件,使用masm命令生成obj文件并输入 上述源程序中使用了外部资源,该外部资源存在于文件 LIB_TIM.OBJ中,因此使用link命令将 ASM41.OBJ 和 LIB_TIM.OBJ 一起链接生成可执行文件 使用debug加载程序并进行调试 使用-g指令,回显如下…

从零构建属于自己的GPT系列5:模型部署1(文本生成函数解读、模型本地化部署、文本生成文本网页展示、代码逐行解读)

&#x1f6a9;&#x1f6a9;&#x1f6a9;Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在PyCharm中进行 本篇文章配套的代码资源已经上传 从零构建属于自己的GPT系列1&#xff1a;数据预处理 从零构建属于自己的GPT系列2&#xff1a;模型训…

FPGA - 1、Simulink HDL coder模型例化到FPGA

Simulink HDL coder模型例化到FPGA 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右…

2024年程序员必备的五大Golang框架

Go语言&#xff0c;简称Golang&#xff0c;是由Google公司开发的一种编程语言&#xff0c;主要特点是简单、快速、安全和高效。在近年来&#xff0c;Golang的应用范围不断扩大&#xff0c;它的高效性和易于编写的特点在互联网领域广受欢迎。Golang在开发Web服务、网络编程、云计…

【正点原子STM32连载】第十三章 串口通信实验 摘自【正点原子】APM32E103最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子APM32E103最小系统板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第十…

前端页面显示的时间格式为:2022-03-18T01:46:08.000+00:00 如何转换为:年-月-日,并根据当前时间判断为几天前

由于后端每条博文的发表时间是以“xxxx—xx—xxxx:xx:xx”的形式显示的&#xff0c; 现在要在前端改成“xxxx年xx月xx日”的形式。 并对10分钟内发表的显示“刚刚”&#xff0c;对24小时内发表的显示“小时前”。 超过24小时&#xff0c;小于48小时&#xff0c;显示“1天前”。…

什么是前端响应式设计(responsive design)?如何实现响应式布局?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

【MySQL】表的操作

表的操作 MySQL表的操作1、创建表2、创建表案例3、查看当前数据库下所有的表4、查看表结构5、查看创建表时的相关细节6、修改表7、删除表 MySQL表的操作 1、创建表 创建表的SQL语法如下&#xff1a; CREATE TABLE [IF NOT EXISTS] table_name(field1 datatype1 [COMMENT 注释…

python|获取接口请求耗时

你想知道我们请求一个url的时候&#xff0c;握手和请求资源分别占用多长时间么&#xff1f;今天我们使用python写个小案例来看看吧。 项目展示 打开项目&#xff0c;修改hosts、port、methods以及url的变量&#xff0c;即可运行python程序便可获得该页面的详细信息的时间&…