Я хотел бы отправить несколько ICMP-запросов, используя неблокирующий сокет и использовать poll
, чтобы получить доступный для чтения сокет. Это работает хорошо, когда есть только один сокет, однако, если я добавлю pollfd в метод poll, событие read будет вызвано несколько раз. (Я уже использую recv для чтения данных из сокета fd).
Вот коды, которые могут воспроизвести мою проблему, чтобы упростить код, я не добавил здесь ни одного дескриптора ошибки.
Полный код в этой сущности
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";
}
}
}
}
}