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

【网络编程】IO复用的应用一:非阻塞connect

  在connect连接中,若socket以非阻塞的方式进行连接,则系统内设置的TCP三次握手超时时间为0,所以它不会等待TCP三次握手完成,直接返回,错误为EINPROGRESS。
  所以,我们可以通过判断connect时返回的错误码是不是EINPROGRESS来实现非阻塞的connect,如果当前是EINPROGRESS并且socket可写,则说明链路建立成功。此时调用getsockopt来清除文件描述符上的错误信息,接下来如果没有错误信息则链路成功建立。
B站一位UP主的讲解

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <time.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <string.h>#define BUFFER_SIZE 1023int setnonblocking(int fd){  //对一个文件描述符设置非阻塞int old_option = fcntl(fd, F_GETFL); //old_option表示fd的旧文件属性int new_option = old_option | O_NONBLOCK; //在old_option上追加非阻塞属性fcntl(fd, F_SETFL, new_option); //给fd设置新属性return old_option; //返回旧属性
}int unblock_connect(const char* ip, int port, int time){int ret = 0;struct sockaddr_in address;bzero(&address, sizeof(address));address.sin_family = AF_INET;inet_pton(AF_INET, ip, &address.sin_addr);//将点分十进制转化为网络字节序address.sin_port = htons(port);//将主机字节序转换为网络字节序int sockfd = socket(PF_INET, SOCK_STREAM, 0);int fdopt = setnonblocking(sockfd);ret = connect(sockfd, (struct sockaddr*)&address, sizeof(address));if(ret == 0){//如果连接成功,就将旧状态设置回去,(回复sockfd属性,并立即返回)printf("connect with server immediately!\n");fcntl(sockfd, F_SETFL, fdopt);//重置sockfd属性return sockfd;}else if(errno != EINPROGRESS){ //如果连接没有立即建立,那么只有当errno时EINPROGRESS时才表示连接还在进行//否则出错返回printf("unblock connect not support!\n");return -1;}fd_set readfds;fd_set writefds;struct timeval timeout;FD_ZERO(&readfds);  //将readfds的文件描述符集合清空FD_SET(sockfd, &writefds); //将sockfd放入writefds的文件描述符集合中timeout.tv_sec = time;timeout.tv_usec = 0;ret = select(sockfd + 1, NULL, &writefds, NULL, &timeout);//监听所有文件描述符中的可读事件,返回就绪文件的文件描述符if(ret <= 0){/*select 超时或者出错,立即返回*/printf("connection time out\n");close(sockfd);return -1;}if(!FD_ISSET(sockfd, &writefds)){//检查sockfd是否在writefds的集合中printf("no events on sockfd found\n");close(sockfd);return -1;}int error = 0;socklen_t length = sizeof(error);/*调用getsockopt来获取并清除sockfd上的错误*/if(getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &length) < 0){printf("get socket option failed\n");close(sockfd);return -1;}/*错误号不为0表示连接出错*/if(error != 0){printf("connection failed after select with the error: %d \n", error);close(sockfd);return -1;}/*连接成功*/printf("connection ready after select with the socket: %d \n", sockfd);fcntl(sockfd, F_SETFL, fdopt);return sockfd;
}int main(int argc, char* argv[]){if(argc <= 2){printf("usag: %s ip_address port_number\n", basename(argv[0]));return 1;}const char* ip = argv[1];int port = atoi(argv[2]);int fd = unblock_connect(ip, port, 0);if(fd < 0 ) return 1;close(fd);return 0;
}

相关文章:

【网络编程】IO复用的应用一:非阻塞connect

在connect连接中&#xff0c;若socket以非阻塞的方式进行连接&#xff0c;则系统内设置的TCP三次握手超时时间为0&#xff0c;所以它不会等待TCP三次握手完成&#xff0c;直接返回&#xff0c;错误为EINPROGRESS。   所以&#xff0c;我们可以通过判断connect时返回的错误码是…...

Spring注解开发,bean的作用范围及生命周期、Spring注解开发依赖注入

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaweb 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Spring注解开发 一、注解开发定义Bean二、纯注解开发Bean三…...

C#设计模式之---原型模式

原型模式&#xff08;Prototype Pattern&#xff09; 原型模式&#xff08;Prototype Pattern&#xff09; 是用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。原型模式是一种创建型设计模式。也就是用一个已经创建的实例作为原型&#xff0c;通过…...

STM32入门学习之外部中断

1.STM32的IO口可以作为外部中断输入口。本文通过按键按下作为外部中断的输入&#xff0c;点亮LED灯。在STM32的19个外部中断中&#xff0c;0-15为外部IO口的中断输入口。STM32的引脚分别对应着0-15的外部中断线。比如&#xff0c;外部中断线0对应着GPIOA.0-GPIOG.0&#xff0c;…...

Jenkins 配置maven和jdk

前提:服务器已经安装maven和jdk 一、在Jenkins中添加全局变量 系统管理–>系统配置–>全局属性–>环境变量 添加三个全局变量 JAVA_HOME、MAVEN_HOME、PATH 二、配置maven 系统管理–>全局工具配置–>maven–>新增 新增配置 三、配置JDK 在系统管…...

Leetcode | Binary search | 22. 74. 162. 33. 34. 153.

22. Generate Parentheses 要意识到只要还有左括号&#xff0c;就可以放到path里。只要右括号数量小于左括号&#xff0c;也可以放进去。就是valid的组合。recurse两次 74. Search a 2D Matrix 看成sorted list就好。直接用m*n表示最后一位的index&#xff0c;并且每次只需要 …...

生命在于折腾——面试问题汇总

这里面的问题都是我参加面试时候遇到的问题&#xff0c;大家就这样看吧。 一、个人情况 1、自我介绍 2、为什么离开上一家公司 3、有没有参加过HVV 4、介绍一下上家公司的项目 5、小程序和公众号渗透测试做过么 6、实习工资多少 7、有挖过漏洞么 二、基础知识 1、信息收集的…...

<Java>Map<String,Object>中解析Object类型数据为数组格式

背景&#xff1a; 前端&#xff1a;入参为字符串和数组类型&#xff1b;通过json字符串传给后台&#xff0c; 后台&#xff1a;后台通过工具解析为Map<String&#xff0c;Object>&#xff0c;然后需要解析出Map里面的数组值做操作&#xff1b; 需求&#xff1a; 入参&…...

别再分库分表了,试试TiDB!

什么是NewSQL 传统SQL的问题 升级服务器硬件 数据分片 NoSQL 的问题 优点 缺点 NewSQL 特性 NewSQL 的主要特性 三种SQL的对比 TiDB怎么来的 TiDB社区版和企业版 TIDB核心特性 水平弹性扩展 分布式事务支持 金融级高可用 实时 HTAP 云原生的分布式数据库 高度兼…...

Java进阶之Dump文件初体验

视频地址&#xff1a;https://www.bilibili.com/video/BV1Ak4y137oh 学习文章&#xff1a;https://d9bp4nr5ye.feishu.cn/wiki/VQoAwlzrXiLFZekuLIyc1uK5nqc 最近线上频繁的内存告警&#xff0c;同事A通过分析dump文件解决了这个问题&#xff0c;我当然是不会放过这种学习的机…...

基于扩展(EKF)和无迹卡尔曼滤波(UKF)的电力系统动态状态估计(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

曲线拟合(MATLAB拟合工具箱)位置前馈量计算(压力闭环控制应用)

利用PLC进行压力闭环控制的项目背景介绍请查看下面文章链接,这里不再赘述。 信捷PLC压力闭环控制应用(C语言完整PD、PID源代码)_RXXW_Dor的博客-CSDN博客闭环控制的系列文章,可以查看PID专栏的的系列文章,链接如下:张力控制之速度闭环(速度前馈量计算)_RXXW_Dor的博客-CSD…...

小程序使用echarts

参考文档&#xff1a;echarts官网、echarts-for-weixin 第一步引入组件库&#xff0c;可直接从echarts-for-weixin下载&#xff0c;也可以从echarts官网自定义生成&#xff0c;这里我们就不贴了组件库引入好后&#xff0c;就是页面引用啦&#xff0c;废话不多说&#xff0c;直…...

面向对象——封装

C面向对象的三大特性为&#xff1a;封装、继承、多态 C认为万事万物都皆为对象&#xff0c;对象上有其属性和行为 例如&#xff1a; ​ 人可以作为对象&#xff0c;属性有姓名、年龄、身高、体重…&#xff0c;行为有走、跑、跳、吃饭、唱歌… ​ 车也可以作为对象&#xf…...

【LeetCode】160.相交链表

题目 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结…...

【JWT的使用】

文章目录 前言1、用户登录1.1 JWTThreadLocal 2.1 代码实现2.1.1 ThreadLocal工具类2.2.2 定义拦截器2.2.3 注册拦截器 前言 1、用户登录 1.1 JWT JSON Web Token简称JWT&#xff0c;用于对应用程序上用户进行身份验证的标记。使用 JWTS 之后不需要保存用户的 cookie 或其他…...

Python获取音视频时长

Python获取音视频时长 Python获取音视频时长1、安装插件2、获取音视频时长.py3、打包exe4、下载地址 Python获取音视频时长 1、安装插件 pip install moviepy -i https://pypi.tuna.tsinghua.edu.cn/simple2、获取音视频时长.py 上代码&#xff1a;获取音视频时长.py # -*-…...

TCP四次握手为什么客户端等待的时间是2MSL

目录 什么是MSL从第三次握手开始分析总结 什么是MSL MSL是Maximum Segment Lifetime英文的缩写&#xff0c;中文可以译为“报文最大生存时间”&#xff0c;他是任何报文在网络上存在的最长时间&#xff0c;超过这个时间报文将被丢弃。 从第三次握手开始分析 第三次握手服务端…...

Android Studio 启用设备远程调试配置完整步聚

启用手机设置->开发者选项-无线调试,然后选择允许 已启用后无线调试变成绿色 ,点击无线调试进入详情页面 点击Android Studio的Device Manager 下的WIFI图标 会弹出下图窗口 打开手机的开发者选项中的WIFI调试(无线调试)下的使用二维码配对设备进行扫描. 设备配对成功后手机…...

玩转LaTeX(三)【数学公式(基础)、​矩阵、多行公式】

数学公式基础 导言区&#xff08;引包&#xff09; \usepackage{amsmath} %带星号的eqution 正文区 \begin{document}%数学公式初步 \section{简介} \LaTeX{}将排版内容分为文本模式和数学模式。文本模式用于普通文本排版&#xff0c;数学模式用于数学公式排版。 …...

Pixel Aurora Engine真实案例:用‘蒸汽朋克猫武士’生成整套游戏美术资源

Pixel Aurora Engine真实案例&#xff1a;用蒸汽朋克猫武士生成整套游戏美术资源 1. 项目背景与工具介绍 Pixel Aurora Engine&#xff08;像素极光引擎&#xff09;是一款基于AI扩散模型的高端像素艺术生成工具。它采用复古的8-bit游戏机风格界面&#xff0c;却能产出专业级…...

基于OpenCASCADE7.4+OSG3.6.3+Qt5.12.7的多文档初级CAD/CAE...

基于opencascade7.4osg3.6.3qt5.12.7的多文档初级Cad/cae平台&#xff0c;支持十几种格式文件&#xff0c;包括step,igs,stl,obj,3ds&#xff0c;osg等&#xff0c;支持视角切换&#xff0c;显示模式切换&#xff0c;仿Cad命令注册机制&#xff0c;装配体显示&#xff0c;模型高…...

AI辅助架构设计:让快马平台智能规划trae状态管理方案

用AI辅助设计trae状态管理方案&#xff1a;以博客后台系统为例 最近在开发一个博客后台管理系统时&#xff0c;遇到了状态管理的难题。系统需要处理文章列表、编辑草稿、用户评论和系统设置等多种数据&#xff0c;如何合理组织这些状态让我头疼不已。幸运的是&#xff0c;在In…...

Go性能剖析pprof工具使用

Go语言凭借其高效的并发模型和简洁的语法&#xff0c;成为众多开发者的首选。随着项目规模扩大&#xff0c;性能问题逐渐显现。如何快速定位性能瓶颈&#xff1f;Go内置的pprof工具正是解决这一问题的利器。本文将带你深入了解pprof的核心功能&#xff0c;助你轻松优化代码性能…...

AI正冲击金融岗!高薪职业如何守住饭碗?金融人转行AI指南

AI技术正全面冲击金融行业&#xff0c;初级分析师、风控专员、客服等中低端认知劳动密集型岗位面临被替代风险。但高端投行、深度研究、资源型和创新型岗位短期内仍安全。金融人转型AI有独特优势&#xff0c;如数据敏感性、业务理解力等。转型路径包括AI应用专家、金融科技产品…...

用Arduino和TCS34725颜色传感器做个桌面小助手:自动识别物体颜色并控制RGB灯带

用Arduino和TCS34725打造智能色彩互动系统&#xff1a;从硬件搭建到场景应用 在创客圈里&#xff0c;色彩交互一直是个充满魅力的领域。想象一下&#xff1a;当你把一杯橙汁放在桌面上&#xff0c;周围的灯光自动变成温暖的橙色&#xff1b;放上一本蓝色封面的书&#xff0c;工…...

思源宋体实战指南:7种字重构建与多语言字体优化技巧

思源宋体实战指南&#xff1a;7种字重构建与多语言字体优化技巧 【免费下载链接】source-han-serif Source Han Serif | 思源宋体 | 思源宋體 | 思源宋體 香港 | 源ノ明朝 | 본명조 项目地址: https://gitcode.com/gh_mirrors/sou/source-han-serif 思源宋体作为Adobe推…...

AWCII 040 CPU模块

AWCII 040 CPU 模块AWCII 040 是工业自动化控制系统中的中央处理单元&#xff08;CPU 模块&#xff09;&#xff0c;主要用于执行控制程序、数据运算及系统管理&#xff0c;是整个控制系统的核心“大脑”。一、基本概述AWCII 040 CPU 模块集成了处理器、存储单元及系统管理功能…...

LSTM预测不准?试试这个全局注意力“外挂”:一个PyTorch模块提升你的时序模型性能

LSTM预测不准&#xff1f;试试这个全局注意力“外挂”&#xff1a;一个PyTorch模块提升你的时序模型性能 当你发现精心调参的LSTM模型在预测股票价格、设备故障率或能源消耗时&#xff0c;总是错过关键转折点&#xff0c;问题可能不在你的数据清洗或超参选择——而是模型缺乏对…...

PDFMathTranslate:3步搞定学术论文AI翻译,完美保留公式排版的终极解决方案

PDFMathTranslate&#xff1a;3步搞定学术论文AI翻译&#xff0c;完美保留公式排版的终极解决方案 【免费下载链接】PDFMathTranslate PDF scientific paper translation with preserved formats - 基于 AI 完整保留排版的 PDF 文档全文双语翻译&#xff0c;支持 Google/DeepL/…...