Ваш цикл for выглядит подозрительно:
for(conns = 0; conns != 3; ) {
Когда conns
когда-либо становится тремя?
Похоже, ваше намерение здесь:
if(pollfds[i].revents & POLLIN)
conns |= i;
Но если i
равно 0
для первого сокета, conns |= i
не изменит значения.
И когда на обоих сокетах будут доступны данные, ваш вызов poll
начнет немедленно возвращаться, но вызастряли в бесконечном цикле.Следовательно, высокая загрузка процессора.
Похоже, что ваш код предназначен для того, чтобы оставаться в цикле до тех пор, пока оба сокета не будут иметь данные, доступные для чтения.Затем вырваться из цикла.Поэтому я подозреваю, что вы действительно имели в виду следующее:
conns |= (i+1);
Есть и другие проблемы.poll
возвращает количество допустимых дескрипторов сокета.Следовательно, эта строка;
for(i = 0; (int)i < nfds; i++) {
Так что, если сокет, связанный с pollfds [1], имеет доступные данные, nfds
будет только 1. Следовательно, ваш цикл будет оценивать только, если pollfds[0]
имеет данные.
Давайте очистим ваш код:
int ready_set = 0x00;
int all_ready_set = 0x03;
int num_sockets = 2;
while (ready_set != all_ready_set)
{
int nfds = poll(pollfds, 2, -1);
if(nfds <= 0)
{
// I would not actually exit. If a socket gets closed locally, you would have a valid and expected error, but maybe that can't happen in your program
exit(1);
}
for (i = 0; i < num_sockets; i++)
{
if (pollfds[i].revents & POLLIN)
{
int mask = 0x01 << i;
pollfds[i].events = 0; // stop listening for events on this socket
ready_set |= mask;
}
}
}