目录
IO多路复用模型中的Select是一种常用的同步IO模型,它允许单个线程监视多个文件句柄(在网络编程中,这些文件句柄通常是socket),并在一个或多个句柄就绪时进行相应的读写操作。以下是关于Select模型的详细解析:
一、基本概念
- IO多路复用:一种同步IO模型,通过单个线程监视多个文件句柄(如socket),当某个句柄就绪时,进行读写操作。它减少了系统开销,避免了为每个连接创建独立线程的需要。
- Select模型:IO多路复用的一种实现方式,通过select系统调用实现。
二、工作原理
- 初始化:创建一个文件描述符集合,用于存放需要监视的文件描述符(socket)。
- 监视:调用select函数,将文件描述符集合传递给内核,让内核监视这些文件描述符的状态变化(如可读、可写、异常)。
- 阻塞等待:select函数会阻塞当前线程,直到一个或多个文件描述符就绪,或者超时发生。
- 处理事件:当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(


1251

被折叠的 条评论
为什么被折叠?



