You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 21:23:10