在MacOS上已经读取过轮询返回事件

时间:2018-11-19 08:16:43

标签: sockets networking nonblocking asyncsocket

我想使用非阻塞套接字发送多个ICMP请求,并使用poll获取可用的可读套接字。当只有一个套接字时,它可以很好地工作,但是如果我将pollfd添加到poll方法中,则将多次触发读取事件。 (我已经使用recv从套接字fd读取数据了)。

这里的代码可以重现我的问题,为简化代码,我在这里没有添加任何错误处理。

完整的代码在此gist

int main(int argc, char **argv) {
    int s1 = sendPacket("74.125.204.100");
    pollfd f1{0};
    f1.fd = s1;
    std::vector<pollfd> pfds;
    pfds.push_back(f1);

//    int s2 = sendPacket("74.125.204.101");
//    pollfd f2{0};
//    f2.fd = s2;
//    pfds.push_back(f2);
////   if uncomment above code, it will more than two read xx output print in console.

    while (true) {
        for (auto &e : pfds) {
            e.revents = 0;
            e.events = POLLIN;
        }
        int ret = poll(&pfds[0], static_cast<nfds_t >(pfds.size()), 1000);
        if (ret > 0) {
            for (auto &e : pfds) {
                if (e.revents == 0) continue;
                if (e.revents & POLLIN) {
                    char buf[1024];
                    int n = recv(e.fd, buf, 1024, 0);
                    std::cout << "read " << n << " bytes for fd " << e.fd << " \n";
                }
            }
        }
    }
}

0 个答案:

没有答案