события опроса возврата уже читались ранее на macos - PullRequest
0 голосов
/ 19 ноября 2018

Я хотел бы отправить несколько 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";
                }
            }
        }
    }
}
...