一、选择模型(select)

SLAM轨迹评估神器evo实战:从GPS到TUM格式的完整转换指南(附Python代码) 本文详细介绍了如何使用evo工具将GPS数据转换为TUM格式,以便进行SLAM轨迹评估。通过Python代码实现GPS到笛卡尔坐标的精确转换,并提供了完整的处理流程和实战案例,帮助开发者轻松完成从原始GPS数据到精确轨迹评估的全过程。特别适用于ORB-SLAM等视觉SLAM算法的性能验证。 阅读详情
█ 选择(select)模型是Winsock中最常见的 I/O模型。核心便是利用 select 函数,实现对 I/O的管理!利用 select 函数来判断某Socket上是否有数据可读,或者能否向一个套接字写入数据,防止程序在Socket处于阻塞模式中时,在一次 I/O 调用(如send或recv、accept等)过程中,被迫进入“锁定”状态;同时防止在套接字处于非阻塞模式中时,产生WSAEWOULDBLOCK错误。

█ select 的函数原型如下:

int select(
  __in          int nfds,
  __in_out      fd_set* readfds,
  __in_out      fd_set* writefds,
  __in_out      fd_set* exceptfds,
  __in          const struct timeval* timeout
);


其中,第一个参数nfds会被忽略。之所以仍然要提供这个参数,只是为了保持与Berkeley套接字兼容。
后面大家看到有三个 fd_set类型的参数:
一个用于检查可读性(readfds),
一个用于检查可写性(writefds),
一个用于例外数据(exceptfds)。


fd_set 结构的定义如下:
typedef struct fd_set { 
 u_int fd_count;
 SOCKET fd_array[FD_SETSIZE];
} fd_set;

#define FD_SETSIZE      64
所以 fd_set 结构中最多只能监视64个套接字。


fdset 代表着一系列特定套接字的集合。其中, readfds 集合包括符合下述任何一个条件的套接字:
● 有数据可以读入。
● 连接已经关闭、重设或中止。
● 假如已调用了listen,而且一个连接正在建立,那么accept函数调用会成功。


writefds 集合包括符合下述任何一个条件的套接字:
● 有数据可以发出。
● 如果已完成了对一个非锁定连接调用的处理,连接就会成功。


exceptfds 集合包括符合下述任何一个条件的套接字:
● 假如已完成了对一个非锁定连接调用的处理,连接尝试就会失败。
● 有带外(Out-of-band,OOB)数据可供读取。


举个例子,假设我们想测试一个套接字是否“可读”,必须将自己的套接字增添到readfds集合中,
然后调用 select 函数并等待其完成。select 完成之后,再次判断自己的套接字是否仍为 readfds 集合的一部分。
若答案是肯定的,则表明该套接字“可读”,可立即着手从它上面读取数据。


在三个参数中(readfds、writefds 和 exceptfds),任何两个都可以是空值( NULL);
但是,至少有一个不能为空值!在任何不为空的集合中,必须包含至少一个套接字句柄;
否则, select 函数便没有任何东西可以等待。最后一个参数 timeout 对应的是一个指针,它指向一个timeval 结构,
用于决定select 最多等待 I/O操作完成多久的时间。如 timeout 是一个空指针,那么 select 调用会无限
期地“锁定”或停顿下去,直到至少有一个描述符符合指定的条件后结束。


对 timeval 结构的定义如下:
tv_sec 字段以秒为单位指定等待时间;
tv_usec 字段则以毫秒为单位指定等待时间。
1秒 = 1000毫秒


若将超时值设置为(0 , 0),表明 select 会立即返回,出于对性能方面的考虑,应避免这样的设置。


█ select 函数返回值:
select 成功完成后,会在 fdset 结构中,返回刚好有未完成的 I/O操作的所有套接字句柄的总量。
若超过 timeval 设定的时间,便会返回0。若 select 调用失败,都会返回 SOCKET_ERROR,
应该调用 WSAGetLastError 获取错误码!


用 select 对套接字进行监视之前,必须将套接字句柄分配给一个fdset的结构集合,
之后再来调用 select,便可知道一个套接字上是否正在发生上述的 I/O 活动。
Winsock 提供了下列宏操作,可用来针对 I/O活动,对 fdset 进行处理与检查:
● FD_CLR(s, *set):从set中删除套接字s。
● FD_ISSET(s, *set):检查s是否set集合的一名成员;如答案是肯定的是,则返回TRUE。
● FD_SET(s, *set):将套接字s加入集合set。
● FD_ZERO( * set):将set初始化成空集合。


例如,假定我们想知道是否可从一个套接字中安全地读取数据,同时不会陷于无休止的
“锁定”状态,便可使用 FDSET 宏,将自己的套接字分配给 fdread 集合,再来调用 select。要
想检测自己的套接字是否仍属 fdread 集合的一部分,可使用 FD_ISSET 宏。采用下述步骤,便
可完成用 select 操作一个或多个套接字句柄的全过程:
1) 使用FDZERO宏,初始化一个fdset对象;
2) 使用FDSET宏,将套接字句柄加入到fdset集合中;
3) 调用 select 函数,等待其返回……select 完成后,会返回在所有 fdset 集合中设置的套接字句柄总数,
并对每个集合进行相应的更新。
4) 根据 select的返回值和 FDISSET宏,对 fdset 集合进行检查。
5) 知道了每个集合中“待决”的 I/O操作之后,对 I/O进行处理,
然后返回步骤1 ),继续进行 select 处理。


select 函数返回后,会修改 fdset 结构,删除那些不存在待决 I/O 操作的套接字句柄。

这正是我们在上述的步骤 ( 4 ) 中,为何要使用 FDISSET 宏来判断一个特定的套接字是否仍在集合中的原因。



封装select函数

BOOL SOCKET_Select(SOCKET hSocket, int nTimeOut, BOOL bRead)
{
	fd_set fdset;
	timeval tv;
	FD_ZERO(&fdset);
	FD_SET(hSocket, &fdset);
	nTimeOut = nTimeOut > 1000 ? 1000 : nTimeOut;
	tv.tv_sec  = 0;
	tv.tv_usec = nTimeOut;

	int iRet = 0;
	if ( bRead ) {
		iRet = select(0, &fdset, NULL , NULL, &tv);
	}else{
		iRet = select(0, NULL , &fdset, NULL, &tv);
	}

	if(iRet <= 0) {
		return FALSE;
	} else if (FD_ISSET(hSocket, &fdset)){
		return TRUE;
	}
	return FALSE;
}


有趣的方式学习DDR5(4)—— DDR5 SDRAM 启动与初始化过程全攻略 🟢。 阅读详情

相关推荐

【GD32篇】驱动AD7616完成数据采集

GD32F10X驱动AD7616完成数据采集

we_long的博客 1万+

Winsock网络编程笔记:select()函数详解,select例子实现非阻塞TCPServer

套接字集合: fd_set (defined in winsock2.h) fd_set结构可以把多个套接字集合在一起,形成一个套接字集合。select函数可以测试这个集合中哪些套接字有事件发生。 typedef struct fd_set { u_int fd_count; // how many are SET ...

Romantic Chopin in C Sharp Minor 2200

自动驾驶仿真(二)—— 基于PreScan与Simulink的联合仿真

自动驾驶仿真软件介绍二—— PreScan与Simulink联合仿真1. Prescan仿真软件2. Prescan与Simulink联合仿真2. 1 Prescan和matlab软件安装2. 2 联合仿真配置3. 联合仿真实例3.1 一辆不按法规行驶的小车3.2 另一辆的正常行驶的小车3.3 视觉辅助摄像机3.4 传感器检测4. 系列学习视频教程5. 参考学习的书目教材 上一篇博文简单介绍了Carsim与Simulink联合仿真,接着这篇就再继续简单介绍另一款自动驾驶仿真软件Prescan,并且简单做个P

zhudj08的博客 1万+

winsock-select模型总结

本文主要总结了winsock中的select模型,这个是多线程网络编程中最简单的通信模型,并附着了代码实践,可以帮助读者很好的理解select模型并用在自己想要用的地方;

qq_41286360的博客 651

【Python】多分类算法—Random Forest

【Python】多分类算法—Random Forest 本文将主要就Random Forest(随机森林)的多分类应用进行描述,当然也可运用于二分类中 文章目录【Python】多分类算法—Random Forest前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 本文主要引用的是sklearn 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): import nump

weixin_43166884的博客 1万+

Windows 11下用Ollama一键部署DeepSeek-R1大模型(附8B/14B版本选择建议)

本文详细介绍了在Windows 11环境下使用Ollama工具一键部署DeepSeek-R1大模型的完整指南,包括8B和14B版本的选择建议。通过硬件评估、安装配置、性能优化等步骤,帮助开发者高效实现本地部署,提升AI应用体验。

weixin_29079643的博客 273

winsock之select选择模型

由于使用传统的socket模型在处理大量的客户端是需要不断的开辟多余的线程,这样无非会很大程度上浪费系统资源,因此,我们需要一种能够管理套接字的模型。最简单的select选择模型可以采用一种有序的方式,轮询fd_set集合,从而同时进行对多个套接字的管理。 所用结构体: typedef struct fd_set { u_int fd_count; ...

qq_43775170的博客 796

第 8 篇:TMC2240 电机正反转实现|DIR 引脚控制 + 代码优化(稳定不抖动)

本文详细介绍了TMC2240电机驱动芯片的正反转实现方法,重点解决方向切换时的抖动和冲击问题。文章首先明确了硬件连接、基础配置和使能状态三个前提条件,然后阐述了DIR引脚电平控制方向的核心原理,提供了STM32的GPIO配置代码。针对方向切换时的电流冲击问题,作者提出了"停止-延迟-切换-启动"的平滑切换逻辑,并给出了包含方向枚举、转速控制和方向切换函数的完整代码实现方案。通过这种优化方法,可以有效避免电机在正反转切换时产生的抖动、冲击声和发热问题,实现稳定的双向控制。文章还提示了后续可

BackCatK Chen的博客 2078

select 模型解释

 套接字模式:阻塞套接字和非阻塞套接字。或者叫同步套接字和异步套接字。套接字模型:描述如何对套接字的I/O行为进行管理。Winsock提供的I/O模型一共有五种: select,WSAAsyncSelect,WSAEventSelect,Overlapped,Completion。今天先讲解select。 1:select模型择模(选型) 先看一下下面的这句代码

fangjm2009的专栏 526

ardupilot开发 --- MavLink 篇

ardupilot开发 --- MavLink 篇

记录老板的每次pua,分享领导每天的毒鸡汤... 4252

6、 实时家禽健康识别与疾病检测系统的深入解析

本文深入解析了一种基于物联网的实时家禽健康识别与疾病检测系统,结合图像分析和音频分析技术,能够有效识别病鸡并防止疾病传播。文章详细介绍了系统的测试环境、数据采集与预处理方法、图像与音频分析流程,并对系统性能进行了全面评估。最后提出了未来改进方向,包括多模态融合、深度学习应用及实时性优化等。

weixin_28840811的博客 186

fd_set 用法 socket

select()函数主要是建立在fd_set类型的基础上的。fd_set(它比较重要所以先介绍一下)是一组文件描述字(fd)的集合,它用一位来表示一个fd(下面会仔细介绍),对于fd_set类型通过下面四个宏来操作:      fd_set set;    FD_ZERO(&set);       /* 将set清零使集合中不含任何fd*/    FD_SET(fd, &set);    /* 将fd加入set集合 */    FD_CLR(fd, &set);    /* 将fd从set集合中清除 *

ccjjyy的专栏 1万+

把 sy-* 带进 ABAP CDS:ABAP 7.50 里的环境信息新姿势($session 与 @Environment.systemField 实战)

摘要:ABAP 7.50在CDS视图中引入两种获取环境信息的方式:1)直接使用$session会话变量读取用户、客户端和系统语言;2)通过@Environment.systemField注解参数,由Open SQL自动注入系统字段。$session方式简单但依赖Open SQL访问路径,非ABAP环境下可能失效;注解参数方案更工程化,依赖关系明确且支持测试。建议ABAP体系内优先使用$session,对外接口采用参数化方案。两种方式各有适用场景,正确选择可避免潜在风险。(148字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 155

(一)Windows网络模型之select模型和事件选择模型

所谓网络模型的不断优化,其本质就是在解决函数调用过程中的阻塞问题(傻等阻塞与执行阻塞)select模型解决的是基本C/S模型中的傻等阻塞(accept和recv)accept函数在没有客户端前来连接的时候会一直阻塞等待,也就是傻等阻塞recv函数进行通信,在对端没有发来数据的时候也就一直阻塞等待,也就是傻等阻塞但是select函数本身也是阻塞的,这属于执行阻塞,recv和send在执行的时候造成的阻塞也是执行阻塞,比如数据有点多,在发送和接收数据时就会执行阻塞通常在实际应用中。............

DongZhaoCheng 1278

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

一.Windows I/O模型之选择(select)模型

1.选择(select)模型:选择模型:通过一个fd_set集合管理套接字,在满足套接字需求后,通知套接字。让套接字进行工作。避免套接字进入阻塞模式,进行无谓的等待。选择模型的核心的FD_SET集合和select函数。通过该函数,我们可以们判断套接字上是否存在数据,或者能否向一个套接字写入数据。2.select函数:int select( int nfds,//忽略,只是为了兼容而...

dixiao3078的博客 284

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Windows Socket五种I/O模型(一)——选择模型(Select)

如果你想在Windows平台上构建服务器应用,那么I/O模型是你必须考虑的。Windows操作系统提供了选择(Select)、异步选择(WSAAsyncSelect)、事件选择(WSAEventSelect)、重叠I/O(Overlapped I/O)和完成端口(Completion Port)共五种I/O模型。每一种模型均适用于一种特定的应用场景。程序员应该对自己的应用需求非常明确,而且综合考虑

555

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

(一)Socket I/O模型之选择(select)

转自:点击打开链接 在windows平台构建网络应用,必须了解socket I/O模型。windows提供了选择(select)、异步选择(WSAAsyncSelect)、事件选择(WSAEventSelect)、重叠I /O(overlapped I/O)和完成端口(completion port)。  一、客户端代码  #include "stdafx.h" #i

MessCodes 979

Window Select 源码分享

《网络概述》与 《网络IO模型》 二文中介绍了,NIO与Select模型的概念。接下来看看open jdk中select模型怎么实现的。 JAVA NIO 例子 上图是现在最常见的NIO写法 ServerSocketChannel.open() 打开一个连接 serverChannel.configureBlocking(false);把连接设置为阻塞 bind(newInet...

懒猫的脚印 596

【网络编程】之六、选择select

select模型在五中模型中是最简单,最容易实现的,当然他的效率当然不如其他四种; select可以去监视一个套接字,看哪个socket有消息到来; int select( _In_ int nfds,//忽略 _Inout_ fd_set *readfds,//一个用于检测可读性的参数 _Inout_ fd_set *writefds,//检查可写性 _Ino

编程之道,自强之路! 1965

Thymeleaf select 使用 和多select 级联选择

1.使用select 并且回绑数据; 页面: 状态: <select name="status" th:field="*{status}" id="idstatus" class="input-select" th:value="*{status}"> <option value="">--请选择--</option> <option th:each=...

likunpeng6656201的博客 5341

c++ select选择模型

讲一下套接字模式和套接字I/O模型的区别。先说明一下,只针对Winsock,如果你要骨头里挑鸡蛋把UNIX下的套接字概念来往这里套,那就不关我的事。 套接字模式:阻塞套接字和非阻塞套接字。或者叫同步套接字和异步套接字。 套接字模型:描述如何对套接字的I/O行为进行管理。 Winsock提供的I/O模型一共有五种: select,WSAAsyncSelect,WSAEventSelect,O

爱在一毛钱 1111

select选择框

在做前端页面表单的时候经常会使用到select选择框,如果选择框的数据比较少或者是固定的可以选择写死,但是一般我们的数据都是数量比较大而且是不固定的,所以要采用动态给select选择框赋值。 还有一种情况是:我们在做修改页面的时候想要一进入修改页面选择框中的值就已经获取到了,这种情况可以和动态给select选择框赋值一起使用。 <div class="layui-form-item"> <label class="layui-form-label">角色</label>

weixin_42342065的博客 2060

设置select菜单禁止选择或选择无效

一、disabled属性 在select上设置disabled="disabled",即可将下拉菜单变为只读状态,不可选择,点击也无效。 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//...

Alone_in_的博客 8681

深入理解select选择模型:网络编程的基石

传统的单线程阻塞I/O模型中,每个I/O操作(如socket读写)会阻塞线程,导致无法同时处理多个连接。多线程/多进程方案虽能缓解问题,但资源消耗大且上下文切换开销高。通过单线程监控多个文件描述符(File Descriptor),仅处理真正活跃的I/O事件,大幅降低资源消耗。是一个位掩码数组,每个比特位对应一个文件描述符的状态(0-未就绪,1-就绪)。文件描述符集合fd_set。发送数据 "Hello"转发数据 "Hello"希望本文能对你有所帮助!I/O模型资源消耗对比。调用select()

和舒貌的博客 1013

iView的Select选择框清空

&lt;template&gt; &lt;Select v-model="model8" ref="resetSelect" clearable&gt; &lt;Option v-for="item in cityList" :value="item.value" :key="item.value"&gt;{{ item.label }}

lihefei_coder的博客 1万+

C# 套接字的select选择模型

select选择模型是套接字进行异步IO的基本模式,非常方便。 在C++中,select()函数的原型如下: int select( __in int nfds, __in_out fd_set* readfds, __in_out fd_set* writefds, __in_out fd_set* exceptfds,

白永辉的专栏 7052
上一篇: ATL布幔之下的秘密(2)
下一篇: 二、异步选择模型(WSAAsyncSelect)
l_stream
博客等级 码龄17年 14粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值