【网络】IO多路复用模型select

目录

一、基本概念

二、工作原理

三、select函数

四、select Qt示例

五、select模型的优缺点

六、应用场景

七、总结


IO多路复用模型中的Select是一种常用的同步IO模型,它允许单个线程监视多个文件句柄(在网络编程中,这些文件句柄通常是socket),并在一个或多个句柄就绪时进行相应的读写操作。以下是关于Select模型的详细解析:

一、基本概念

  • IO多路复用:一种同步IO模型,通过单个线程监视多个文件句柄(如socket),当某个句柄就绪时,进行读写操作。它减少了系统开销,避免了为每个连接创建独立线程的需要。
  • Select模型:IO多路复用的一种实现方式,通过select系统调用实现。

二、工作原理

  1. 初始化:创建一个文件描述符集合,用于存放需要监视的文件描述符(socket)。
  2. 监视:调用select函数,将文件描述符集合传递给内核,让内核监视这些文件描述符的状态变化(如可读、可写、异常)。
  3. 阻塞等待:select函数会阻塞当前线程,直到一个或多个文件描述符就绪,或者超时发生。
  4. 处理事件:当select函数返回时,检查文件描述符集合,找出哪些文件描述符就绪,并进行相应的读写操作。

三、select函数

select函数的原型如下:

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

 

  • 参数说明
    • nfds:待测试的文件描述符集合中最大文件描述符加1(因为文件描述符是从0开始的)。
    • readfds:指向可读文件描述符集合的指针。
    • writefds:指向可写文件描述符集合的指针。
    • exceptfds:指向异常条件文件描述符集合的指针。
    • timeout:指定等待的最长时间,如果设置为NULL,则永久等待。
  • 返回值:返回就绪的文件描述符数量,如果超时则返回0,如果出错则返回-1。

四、select Qt示例

tcpserver.h

#ifndef TCPSERVER_H
#define TCPSERVER_H
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <list>
#include <map>
// //sock--包大小,缓冲区,偏移量
struct stru_pack{
    int   m_nPackSize;
    char *m_pszbuf;
    int   m_noffset;
};
class TCPServer
{
public:
    TCPServer();
    ~TCPServer();
public:
    bool initNetWork(const char* szip ="127.0.0.1",short nport = 1234);
    void unInitNetWork(const char *szerr = "");
    bool sendData(SOCKET sock,const char* szbuf,int nlen);
    void recvData(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的小猴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值