linux select 服务器,linux下使用select I/O复用和多线程编程实现简单的TCP服务器

2023-05-16

I/O复用之Select模型

I/O复用使得程序能够同时监听多个文件描述符,但是,他本身也是阻塞的,并且当一个或多个文件描述符准备就绪时,如果不采用其他措施,程序只能按顺序处理其中的每个文件描述符。如果要使程序能够并行运行,只能使用多进程或多线程的方式。

Linux下实现I/O复用的系统调用主要有select、poll和epoll,下面将详细介绍select的系统调用。

Select系统调用的用途:在一段时间内,监听用户感兴趣的文件描述符上面的可读、可写和异常等事件。

相关API的介绍:

#include 

int select(int nfds, fd_set * readfds, fd_set * writefdds, fd_set * exceptfds, struct timeval * timeout);

①、nfds参数:所有监听的文件描述符的最大值 + 1

②、readfds、writefds和exceptfds参数分别为可读、可写和异常等事件对应的文件描述符集合;程序只需要传入自己感兴趣的文件描述符,内核将修改他们来通知程序那些文件描述符已经准备就绪;fd_set结构体仅包含一个整形数组,该数组的每一个元素的每一位标志一个文件描述符,下面的一组宏用来操作fd_set的每一位:

FD_ZERO(fd_set * fdset);//清除fd_set的所有位

FD_SET(int fd, fd_set * fdset);//设置fdset的位fd

FD_CLR(int fd, fd_set * fdset);//清除fdset的位fd

int FD_ISSET(int fd, fd_set * fdset);//测试fdset的位fd是否被设置

③、ttimeout参数:timeout参数是一个timeval结构体,timeval的结构体的定义如下:

struct timeval

{

long tv_sec;//秒数

long tv_usec;//微秒数

};

如果tv_sec和tv_usec都设置为0,则select立即返回, 如果timeout参数设置为NULL,则select一直阻塞直到某个文件描述符准备就绪。

返回值:成功返回就绪的文件描述符的总数,如果超过时间内没有任何文件描述符准备就绪,select将返回0,失败则返回-1并设置errno;若在select等待事件内程序接收到信号,则select立即返回-1,并设置errno为EINTER。

文件描述符的就绪条件:

可读描述符就绪条件:

①、接收缓冲区中的字节数大于或等于SO_RCVLOWAT标志

‚、有新的连接请求

ƒ、对方关闭连接

④、有未处理的错误

可写描述符的就绪条件:

①、发送缓冲区中的可用字节数大于或等于SO_SENLOWAT标志

‚、写操作被关闭

ƒ、有未处理的错误

异常文件描述符的就绪条件:

①、socket上接收带外数据

代码示例:

分享的代码主要是使用select系统调用和多线程编程实现一个简单的并行的TCP服务器

select 模型的有缺点:

优点:select模型的优点之一就是良好的跨平台支持

缺点:

1、单个进程能够监测的文件描述符有限,一般为1024,可以通过修改内核修改

2、select维护了存储大量文件描述符的数据结构,随着文件描述符的增加,其复制的开销及遍历造成的开销影响系统效率。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux select 服务器,linux下使用select I/O复用和多线程编程实现简单的TCP服务器 的相关文章

  • Java内存分配及值、引用的传递

    关于堆栈的内容网上已经有很多资料了 xff0c 这是我找的加上自己理解的一篇说明文 xff1a 一 内存区域类型 1 寄存器 xff1a 最快的存储区 由编译器根据需求进行分配 我们在程序中无法控制 xff1b 2 栈 xff1a 存放基本
  • NEMA-0183(GPRMC GPGGA)详细解释

    NEMA 0183 GPRMC GPGGA 详细解释 nmea数据如下 xff1a GPGGA 121252 000 3937 3032 N 11611 6046 E 1 05 2 0 45 9 M 5 7 M 0000 77 GPRMC
  • [转]printf 函数实现的深入剖析

    研究printf的实现 xff0c 首先来看看printf函数的函数体 int printf const char fmt int i char buf 256 va list arg 61 va list char amp fmt 43
  • http_parser

    最近读了 http parser 的源码 xff0c 记录下 有意思的地方 xff1a 1 协议解析可以不完全解析完 xff0c 但是当前 parser 会记录解析状态 xff0c 这样可以继续解析 2 协议解析首要还是要了解协议本身 xf
  • linux 网络编程 3---(io多路复用,tcp并发)

    1 xff0c io模型 xff1a 阻塞io 非阻塞io io多路复用 xff0c 信号驱动io 阻塞Io与非阻塞io的转换 xff0c 可用fcntl 函数 include lt unistd h gt include lt fcntl
  • 计算机网络socket实验报告,计算机网络socket编程实验报告

    计算机网络socket编程实验报告 由会员分享 xff0c 可在线阅读 xff0c 更多相关 计算机网络socket编程实验报告 4页珍藏版 请在人人文库网上搜索 1 实课程名称实验项目名称实验时间 日期及节次 专业年级姓名验计算机科学与技
  • linux 内核重定位,linux内核netfilter实现url重定向

    include include 34 url redirect h 34 struct sk buff tcp newpack u32 saddr u32 daddr u16 sport u16 dport u32 seq u32 ack
  • can/socket can

    1 概念 参考 xff1a Linux CAN编程详解 can引脚 xff1a cn2 15 xff1a CAN1 H 19 CAN1 L 根据每组报文开头的 11 位标识符 扩展帧为29位标识符 CAN 2 0A 规范 解释数据的含义来决
  • C#不能在匿名方法、lambda表达式、查询表达式或本地函数中使用ref、Out或in参数

    报错信息 Error CS1628 C 不能在匿名方法 lambda表达式 查询表达式或本地函数中使用ref Out或in参数 Error CS1628 Cannot use ref out or in parameter xx insid
  • STL 智能指针

    转自 xff1a https blog csdn net k346k346 article details 81478223 STL一共给我们提供了四种智能指针 xff1a auto ptr unique ptr shared ptr和we
  • 【转】目前最常见的”无线通信(数据)传输技术“有哪些?

    近年来 xff0c 随着电子技术 计算机技术的发展 xff0c 无线通信技术蓬勃发展 xff0c 出现了各种标准的无线数据传输标准 xff0c 它们各有其优缺点和不同的应用场合 xff0c 本文将目前应用的 无线通信种类进行了分析对比 xf
  • 认证 (authentication) 和授权 (authorization) 的区别

    以前一直分不清 authentication 和 authorization xff0c 其实很简单 xff0c 举个例子来说 xff1a 你要登机 xff0c 你需要出示你的 passport 和 ticket xff0c passpor
  • stm32f407VE+enc28j60+lwip2.0.2

    407自带以太网mac模块 xff0c 一般外挂一个PHY芯片就可以实现以太网物理层 xff1b 以下是stm32f407VE 43 enc28j60 43 lwip2 0 2实现最基本的以太网通信功能 1 新建工程 xff0c 此处省略1
  • 关于步进电机的半流设置、衰减设置

    连接 xff1a https zhidao baidu com question 1668040896278315667 html 电流是电机运行的载体 xff0c 但电压的高低也直接影响到电流 xff0c 很多人使用步进电机存在误区 xf
  • 三十二、http与www服务介绍

    一 用户访问百度 xff08 www baidu com xff09 用户访问在url中输入地址后 xff0c 首先会访问本地的缓存和hosts文件 xff0c 如果没有 xff0c 会访问本地DNS xff0c 在就是根域和顶级域名等 x
  • UNIX网络编程卷1 - >环境搭建(ubuntu16.04)

    学习unp网络编程 xff0c 树上的例子均存在 include unp h xff0c 故需要对环境进行配置 1 到资源页下载 www unpbook com 2 解压并将unpv13e移动到相应的文件夹下 因为我是在windows电脑装
  • HTTP认证之基本认证——Basic(二)

    导航 HTTP认证之基本认证 Basic xff08 一 xff09 HTTP认证之基本认证 Basic xff08 二 xff09 HTTP认证之摘要认证 Digest xff08 一 xff09 HTTP认证之摘要认证 Digest x
  • 超声波雾化模块_超声波加湿器让果蔬保持新鲜

    水果和蔬菜的保鲜对于超市和餐饮业来说非常重要 保持蔬菜的新鲜度一直令人头疼 xff0c 因为蔬菜和水果的新鲜度直接影响客户的购买 因此 xff0c 为了有效地延长蔬菜水果的保鲜期 xff0c 喷洒蔬菜水果 xff0c 延长其保鲜期很重要 目
  • Visual Studio 内置宏的查看与使用

    C 43 43 工程 C 43 43 工程是最容易查看宏的 因为很多值的编辑 xff0c 都提供了宏的查看 C 工程 C 的工程 xff0c 不容易查看宏 因为很少提供宏的查看窗口 所以 xff0c 我这里给出总结就有必要了 NET Fra
  • STM32-OLED屏幕显示教程

    目录 1 OLED屏幕介绍 2 OLED屏幕显示一个点的思路 3 配置OLED屏幕 4 OLED显示字符串 5 OLED屏幕显示汉字 6 OLED屏幕显示图片 7 总结 我的上篇文章已经介绍过IIC协议 xff08 本篇文章不对IIC协议做

随机推荐