Я застрял, получив системный вызов select() для разблокировки. Я пытаюсь мультиплексировать ввод данных из набора из 3 сокетов. Я создаю сокет для каждого интерфейса в массиве ints, называемом sock []. Если я раскомментирую первый блок, я могу получать данные по каждому сокету без проблем. С комментариями я никогда не прохожу от вызова select(). Можете ли вы увидеть что-нибудь, что я могу сделать неправильно в отношении настройки() и вызова?select() системный вызов не разблокируется
//This block will receive data from sock[0], sock[1], and sock[2] when left uncommented
/*n = recvfrom(sock[2], buf, 1500,0,(struct sockaddr*)&recvaddr, &recvaddrlen);
printf("\nrecieved\n");
print_buf(buf);*/
fd_set sockets;
FD_ZERO(&sockets);
for(i=0; i<3; i++){
FD_SET(sock[i], &sockets);
}
select(3, &sockets, NULL, NULL, NULL);
printf("\nSocket selected\n");
for(i=0; i<3; i++){
//Check for connected sockets
if(FD_ISSET(i, &sockets)){
printf("\nSocket %d", i);
n = recvfrom(sock[i], buf, 1500,0,(struct sockaddr*)&recvaddr, &recvaddrlen);
}
}
Я настоятельно рекомендую переключиться на 'poll' вместо' select'. Это действительно ужасная функция для использования. – SergeyA
@SergeyA - к сожалению, я думаю, что 'select' по-прежнему остается самым портативным, поэтому в некоторых случаях его использование может быть оправдано. Тем не менее, «опрос» - это мой переход к простому использованию. 'epoll' является более мощным, но сложнее в использовании и Linux-only. –
@BrianMcFarland, я не знаю какой-либо современной системы, которая имеет 'select', но не' poll'. У вас есть конкретный пример? «epoll» - это, конечно же, Linux. – SergeyA