网络编程——select介绍
一、select函数简介
select一般用在socket网络编程中,在网络编程的过程中,经常会遇到许多阻塞的函数,网络编程时使用的recv, recvfrom、connect函数都是阻塞的函数,当函数不能成功执行的时候,程序就会一直阻塞在这里,无法执行下面的代码。这是就需要用到非阻塞的编程方式,使用 selcet函数就可以实现非阻塞编程。
selcet函数是一个轮循函数,即当循环询问文件节点,可设置超时时间,超时时间到了就跳过代码继续往下执行
select(),确定一个或多个套接口的状态,本函数用于确定一个或多个套接口的状态,对每一个套接口,调用者可查询它的可读性、可写性及错误状态信息,用fd_set结构来表示一组等待检查的套接口,在调用返回时,这个结构存有满足一定条件的套接口组的子集,并且select()返回满足条件的套接口的数目。
通常采用select实现多路复用,也就是说可以同时监听多个文件描述符;
下面是select的函数原型:
/* According to POSIX.1-2001 */
2 #include <sys/select.h>
3
4 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
下面进行具体的解释:
第一个参数:int nfds--->是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1
第二个参数:fd_set *readfds---->用来检查一组可读性的文件描述符。
第三个参数:fd_set *writefds---->用来检查一组可写性的文件描述符。
第四个参数:fd_set *exceptfds---->用来检查文件文件描述符是否异常
第五个参数:sreuct timeval *timeout--->是一个时间结构体,用来设置超时时间
timeout:最多等待时间,对阻塞操作则为NULL
select函数的返回值
负值:select错误
正值:表示某些文件可读或可写
0:等待超时,没有可读写或错误的文件
下面是一些跟select一起使用的函数及结构的作用
void FD_CLR(int fd, fd_set *set);//清空一个文件描述符的集合
int FD_ISSET(int fd, fd_set *set);//将一个文件描述符添加到一个指定的文件描述符集合中
void FD_SET(int fd, fd_set *set);//将一个给定的文件描述符从集合中删除;
void FD_ZERO(fd_set *set);//检查集合中指定的文件描述符是否可以读写
struct timeval结构是用来设置超时时间的,该结构体可以精确到秒跟毫秒
struct timeval
{
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
下面是select常用的一个例子:
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h> int main(int argc, cahr **argv)
{
struct timeval timeout;
int ret = 0;
fd_set rfds; FD_ZERO(&rfds);//清空描述符集合
FD_SET(0, &rfds);//将标准输入(stdin)添加到集合中
FD_SET(sockfd, &rfds);//将我们的套接字描述符添加到集合中
/*设置超时时间*/
timeout.tv_sec = 1;
timeout.tv_usec = 0; /*监听套接字是否为可读*/
ret = select(sockfd+1, &rfds, NULL, NULL, &timeout);
if(ret == -1) {//select 连接失败
perror("select failure\n");
return 1;
}
else if(ret == 0) {//超时(timeout)
return 1;
} if(FD_ISSET(pesockfd, &rfds)) {//如果可读 //recv or recvfrom
..................
} return 0;
}
网络编程——select介绍的更多相关文章
- 1.Android网络编程-HTML介绍
1.HTML介绍 超文本标记语言(HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言. 在Eclipse下则可以使用自带的浏览器浏览html: 2.H ...
- python select网络编程详细介绍
刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...
- UNIX网络编程——select函数的并发限制和 poll 函数应用举例
一.用select实现的并发服务器,能达到的并发数,受两方面限制 1.一个进程能打开的最大文件描述符限制.这可以通过调整内核参数.可以通过ulimit -n来调整或者使用setrlimit函数设置, ...
- Socket网络编程基本介绍
一,socket的起源 socket一词的起源 在组网领域的首次使用是在1970年2月12日发布的文献IETF RFC33中发现的, 撰写者为Stephen Carr.Steve Crocker和Vi ...
- 网络编程-Socket介绍
Socket介绍 什么是socket?(5分钟) Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议 ...
- 网络编程select函数
select函数的作用: 在编程的过程中,经常会遇到许多阻塞的函数,好像read和网络编程时使用的recv, recvfrom函数都是阻塞的函数,当函数不能成功执行的时候,程序就会一直阻塞在这里,无法 ...
- 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现
一.客户端/服务器架构(C/S架构) 即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...
- 网络编程OSI介绍
网络编程 软件开发架构 c/s架构(client/server) c:客户端 s:服务端 客户端和服务器端架构,这种架构是从用户层划分的,一般客户端就是在用户电脑上安装的应用程序,而服务端就是公司里的 ...
- UNIX网络编程-Select模型学习
1.相关接口介绍 1.1 select ---------------------------------------------------------------------- #include ...
随机推荐
- RocketMQ Release Note(RocketMQ升级日志译文)
RocketMQ升级日志 1 4.2.0 原版Release Note 1.1 New Feature 支持传输层安全性 客户端支持log4j2 PushConsumer支持条数与大小维度的流控 1. ...
- NetCore 统一处理 webapi 返回null 转为“”
数据库中部分表字段允许空值,则代码中实体类对应的字段类型为可空类型Nullable<>,如int?,DateTime?,null值字段序列化返回的值都为null,前端对应字段赋值需要做nu ...
- 使用Supervisord软件管理go服务进程
一.介绍Supervisord软件1.什么是Supervisord?Supervisord是一个非常优秀的进程管理工具,使用Python开发.它可以在类UNIX系统的方式让用户来准确地监视和控制后台一 ...
- intent 和 Broadcast Receiver之间的通信
工作原理是通过封装一个service启动的一个线程产生的随机数封装到intent对象传递给Activity,Activity接受到后讲结果输出到屏幕. java的代码: package jm.out; ...
- 2019 草花手游java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.草花手游等公司offer,岗位是Java后端开发,因为发展原因最终选择去了草花手游,入职一年时间了,也成为了面 ...
- Mybatis事物浅谈
本篇文章主要对Mybatis事物进行基础的介绍.先回顾JDBC事物,再了解Mybatis里面的事物应用. 1.JDBC的事务管理回顾 JDBC的事务管理是基于Connection对象实现的: 开启事务 ...
- 为什么K8s会成为主流?
容器技术和K8s是云原生概念的核心和基础.云计算诞生已有超过10年,但云计算时代的应用到底该是什么样子,一直没人能说清楚,也没人能确定云计算的基础架构将会如何发展.在K8s出现之前,没人设想过会有一个 ...
- Vue学习之路由vue-router传参及嵌套小结(十)
一.路由传递参数: 1.使用query传值: <!DOCTYPE html> <html lang="en"> <head> <meta ...
- 23、vue实现获取短信验证码
1.html页面: <el-form-item prop="phoneCode" class="pr"> <el-input placehol ...
- 基于RSA的WEB前端密码加密方案
受制于WEB页面源码的暴露,因此传统的对称加密方案以及加密密钥都将暴露在JS文件中,同样可以被解密. 目前比较好的解决方案是WEB页面全程或用户登录等关键环节使用HTTPS进行传输. 另外一种解决方案 ...