Linux 多路转接 —— poll

传统艺能😎

小编是双非本科大二菜鸟不赘述,欢迎米娜桑来指点江山哦
在这里插入图片描述
1319365055

🎉🎉非科班转码社区诚邀您入驻🎉🎉
小伙伴们,满怀希望,所向披靡,打码一路向北
一个人的单打独斗不如一群人的砥砺前行
这是和梦想合伙人组建的社区,诚邀各位有志之士的加入!!
社区用户好文均加精(“标兵”文章字数2000+加精,“达人”文章字数1500+加精)
直达: 社区链接点我


在这里插入图片描述

poll🤣

poll 也是系统提供的一个多路转接接口。poll 系统调用也可以让程序同时监视多个文件描述符上的事件是否就绪,和 select 定位是一样的,适用场景也是一样的。

p o l l 函数的函数原型如下: \color{red} {poll 函数的函数原型如下:} poll函数的函数原型如下:

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

fds 为一个 poll 函数监视的结构列表,每一个元素包含三部分内容:文件描述符、监视的事件集合、就绪的事件集合nfds 为 fds 数组长度。timeout 为poll函数的超时时间,单位是毫秒(ms)。

timeout 可取值:

-1:poll 调用后阻塞等待,直到被监视的某个文件描述符上的某个事件就绪。
0:poll 调用后非阻塞等待,无论被监视的文件描述符上的事件是否就绪,poll 检测后都会立即返回。
特定的时间值:poll 调用后在指定的时间内进行阻塞等待,如果被监视的文件描述符上一直没有事件就绪,则在该时间后 poll 进行超时返回。

函数调用成功则返回有事件就绪的文件描述符个数。如果 timeout 时间耗尽,则返回 0。如果函数调用失败,则返回 -1,同时错误码会被设置。

在 poll 调用失败后会设置错误码,具体分为四种错误码:

EFAULT:fds数组不包含在调用程序的地址空间中。
EINTR:此调用被信号所中断。
EINVAL:nfds值超过RLIMIT_NOFILE值。
ENOMEM:核心内存不足。

struct pollfd🤣

struct pollfd 结构当中包含三个成员:

fd:特定的文件描述符,若设置为负值则忽略events字段并且revents字段返回0。
events:需要监视该文件描述符上的哪些事件。
revents:poll函数返回时告知用户该文件描述符上的哪些事件已经就绪。
在这里插入图片描述
events 和 revents 的取值:

在这里插入图片描述
这些取值实际都是以宏的方式进行定义的,它们的二进制序列中有且仅有一个比特位是1,且为 1 的比特位是各不相同的

在这里插入图片描述

因此在调用poll函数之前,可以通过 | 运算符将要监视的事件添加到 events 中。poll 返回后,可以通过 & 运算符检测 revents 成员中是否包含特定事件,以得知对应文件描述符的特定事件是否就绪

poll 服务器😘

poll 工作流程和 select 是基本类似的,这里我们也实现一个简单poll服务器,该服务器也只是读取客户端发来的数据并进行打印。

PollServer类😁

PollServer类当中只需要包含监听套接字和端口号两个成员变量,在 poll 服务器绑定时直接将 IP 地址设置为INADDR_ANY即可。

在构造 PollServer 对象时,需要指明 poll 服务器端口号,当然也可以在初始化 poll 服务器的时候指明。
在初始化 poll 服务器的时候调用 Socket 类中的函数,依次进行套接字的创建、绑定和监听即可,这里的 Socket 类和之前实现的一样。
在析构函数中可以选择调用 close 函数将监听套接字进行关闭,但实际也可以不进行该动作,因为服务器运行后一般是不退出的。
代码如下:

#pragma once

#include "socket.hpp"
#include <poll.h>

#define BACK_LOG 5

class PollServer{
   
private:
	int _listen_sock; //监听套接字
	int _port; //端口号
public:
	PollServer(int port)
		: _port(port)
	{
   }
	void InitPollServer()
	{
   
		_listen_sock = Socket::SocketCreate();
		Socket::SocketBind(_listen_sock, _port);
		Socket::SocketListen(_listen_sock, BACK_LOG);
	}
	~PollServer()
	{
   
		if (_listen_sock >= 0)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

乔乔家的龙龙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值