我想使用非阻塞套接字发送多个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";
}
}
}
}
}