在C++中实现多事件轮询并等待首个事件响应的方案
多套接字输入监听的面向对象实现方案
在POSIX系统中,要监听多个套接字的输入,可通过poll函数监听多个pollfd结构体的POLLIN事件,示例代码如下:
struct pollfd pollFds[2] = {}; pollFd[0].fd = socket_0; pollFd[1].fd = socket_1; pollFd[0].events = POLLIN; pollFd[1].events = POLLIN; while (true) { int rc = poll(&pollFds, 2, 100); }
但我当前开发的是上层抽象的面向对象接口,不对外暴露套接字,接口定义如下:
class InavjagaGSPIO { protected: int socketfd; public: MoveEvent recvMove(); }; class InavjagaIO { private: std::vector<std::shared_ptr<ServerInavjagaGSPIO>> neighbors; public: MoveEvent getMove(); };
核心需求
- 等待第一个发送输入的邻居
x; - 处理该邻居的输入;
- 将
x.recvMove()重新加入等待池; - 返回继续等待其他邻居的输入。
另外,我已经在构造函数中为recv调用设置了超时:
struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
我曾查阅std::async文档但没找到合适的解决方案,记得Python的asyncio有类似功能,但不确定怎么在C++中实现。
预研的可选方案
主要有以下几种可能性:
- 为每个
InavjagaGSPIO对象的recvMove()方法做异步轮询; - 为每个
InavjagaGSPIO对象分配单独线程执行recvMove(); - 从每个
InavjagaGSPIO对象中提取socketfd,创建pollfd后通过poll逐个处理; - 使用
event.h设置回调来处理输入。
注:poll或事件的开销在可接受范围内,当前服务器最多支持9个客户端。
后续计划
感谢各位的宝贵回答,我近期将尝试相关方案,并在个人项目中进行测试。
此次提问是为了独立完成个人项目,同时希望问题的解答能帮助到其他开发者。
内容的提问来源于stack exchange,提问作者FLAK-ZOSO
相关产品推荐
相关产品推荐

