Linux 非阻塞网络IO模式

news2024/11/15 17:55:16

非阻塞网络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;
}

在这里插入图片描述

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

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

相关文章

Tita集成无代码API:电商客服与营销系统的升级

API的力量&#xff1a;优化电商与客服系统的无代码集成解决方案 在数字化转型的时代&#xff0c;电商与客服系统的高效运作对于企业的成功至关重要。无代码API平台Tita为此提供了一站式解决方案&#xff0c;使企业在无需深入的代码开发工作的前提下&#xff0c;便能实现各种系…

安装2023最新版Java SE 21.0.1来开发Java应用程序

安装2023最新版Java SE 21.0.1来开发Java应用程序 Install the latest version of Java SE 21.01 to Develop Java Applications By JacksonML 本文简要介绍如何下载和安装2023年最新版Java Development Kit (简称JDK&#xff0c;即Java开发工具包标准版&#xff09;21.0.1&…

互联网加竞赛 python 爬虫与协同过滤的新闻推荐系统

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python 爬虫与协同过滤的新闻推荐系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&…

编程性能调优方案

微信公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、字符串与集合性能优化 1.String 对象的实现 在 Java 语言中&#xff0c;Sun 公司的工程师们对 String 对象做了大量的优化&#xff0c;来节…

力扣 | 437. 路径总和 III

437. 路径总和 III mport java.util.ArrayList; import java.util.List;/*** int的取值范围&#xff1a;* -2^31 ~ 2^31-1* <p>* -2147483648 ~ 2147483647&#xff08;约等于10的9次方&#xff09;* <p>* long long的取值范围&#xff1a;* -2^63 ~ (2^63-1&…

gitee创建一个新仓库和提交代码到码云

gitee创建一个新的项目并提交到码云 新建一个仓库 填写创建基本信息 以这个新创建的仓库保存项目所有的代码 在IDEA中克隆这个项目 从版本控制中新建一个git项目 从码云成功克隆项目 创建微服务模块 创建第商品模块 以以上同样的步骤完成下面几个模块的创建 聚合总…

软考科目如何选择?

软考科目繁多&#xff0c;让许多学弟学妹感到困惑&#xff0c;不知道该选择哪个科目。以下是一些建议&#xff0c;可以根据个人实际需求选择备考的科目。 1、初级是可选的 软考初级非常简单&#xff0c;适合刚刚入门学习的朋友报考。对于一些有基础的朋友&#xff0c;建议直接…

基于JAVA的校园电子商城系统论文

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此校园购物信息的…

智慧工地源码:为施工企业提供专业落地的解决方案

智慧工地利用物联网、大数据、AI等核心技术&#xff0c;实时采集现场数据&#xff0c;自动分析&#xff0c;精准分析、智能决策、科学评价&#xff0c;形成一套数据驱动的新型管理模式。为施工企业提供生产提效、安全可控、成本节约的项目管理解决方案&#xff0c;提升项目部管…

AI猫图片展示

AI猫展示 文章目录 AI猫展示

环球市场的风险管理:跨境电商如何规遍全球商务

随着全球化的推进&#xff0c;跨境电商正成为连接不同国家和地区商业的桥梁。然而&#xff0c;这一全球化的商业格局也伴随着各种潜在的风险和挑战。 本文将深入探讨跨境电商在环球市场中的风险管理策略&#xff0c;旨在揭示如何规遍全球商务&#xff0c;确保企业在全球范围内…

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

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

Seata服务端启动流程

1.run方法启动 当ServerApplication的run方法启动的时候会调用到run方法的callRunners方法中对实现了CommandLineRunner接口的类进行run方法的加载 而在seata中ServerRunner实现了CommandLineRunner接口所以会加载到ServerRunner 的run方法中实现seata服务端的启动 Overridepu…

“机器人V2.0时代已来”-任务规划难题迎刃而解,世界因机器人改变而翻转!

01-VILA背景简介 2022年&#xff0c;Michael Ahn, Anthony Brohan等人提出“Do as i can, not as i say: Grounding language in robotic affordances”算法。本文指出虽然大型语言模型可以编码关于世界的丰富语义知识&#xff0c;而这些知识对旨在对用自然语言表达的高级、时…

系统的安全性设计

要设计一个安全的系统&#xff0c;除了要了解一些前面讲到的常用的保护手段和技术措施外&#xff0c;还要对系统中可能出现的安全问题或存在的安全隐患有充分的认识&#xff0c;这样才能对系统的安全作有针对性的设计和强化&#xff0c;即“知己知彼&#xff0c;百战百胜”。 下…

【超图】SuperMap iClient3D for WebGL/WebGPU ——暴雪

作者&#xff1a;taco 时隔多年北京又开始降下了特大暴雪。身为打工人的你有没有居家办公呢&#xff1f;反正小编我是没有。既然没有借着暴雪的功劳居家办公&#xff0c;那就接着雪来输出一篇博客好了。基于SuperMap iClient3D for WebGL/WebGPU 实现暴雪仿真效果。 先来看下效…

三年没回家过年,你的羽绒服准备好了吗?

2023进入尾声&#xff0c;这一年&#xff0c;我们在“阳康”之后重新出发&#xff0c;找回了烟火气&#xff0c;和错过几年的山水重逢&#xff0c;向往远方的同时也更爱眼前的点滴&#xff0c;逐渐重建起对美好生活的期待。 把生活态度投射到社媒上&#xff0c;出圈的热点话题…

设置一个vue文件的全局模板

VsCode在新建一个.vue文件的时候是空白的&#xff0c;需要我们自己输入片段&#xff0c;可这些在每次新建.vue文件都需要自己手敲&#xff0c;所以创建一个模板方便使用 设置vue模板 导入 {"生成 vue 模板": {"prefix": "vue","body"…

【每日一题】反转二叉树的奇数层

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;广度优先搜索方法二&#xff1a;深度优先搜索 写在最后 Tag 【深度优先搜索】【广度优先搜索】【二叉树】【2023-12-15】 题目来源 2415. 反转二叉树的奇数层 题目解读 反转二叉树奇数层的节点。 解题思路 对于二叉…

文献管理器Zotero使用WebDAV结合内网穿透实现公网环境跨平台同步文献笔记

文章目录 一、Zotero安装教程二、群晖NAS WebDAV设置三、Zotero设置四、使用公网地址同步Zotero文献库五、使用永久固定公网地址同步Zotero文献库 Zotero 是一款全能型 文献管理器,可以 存储、管理和引用文献&#xff0c;不但免费&#xff0c;功能还很强大实用。 ​ Zotero 支…