2016-04-01 5 views
1

Я застрял, получив системный вызов 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); 
     } 
    } 
+2

Я настоятельно рекомендую переключиться на 'poll' вместо' select'. Это действительно ужасная функция для использования. – SergeyA

+0

@SergeyA - к сожалению, я думаю, что 'select' по-прежнему остается самым портативным, поэтому в некоторых случаях его использование может быть оправдано. Тем не менее, «опрос» - это мой переход к простому использованию. 'epoll' является более мощным, но сложнее в использовании и Linux-only. –

+0

@BrianMcFarland, я не знаю какой-либо современной системы, которая имеет 'select', но не' poll'. У вас есть конкретный пример? «epoll» - это, конечно же, Linux. – SergeyA

ответ

8

Вы передаете неправильное значение для параметра nfds.

http://linux.die.net/man/2/select

«nfds является наивысшим номером дескриптора файла в любом из трех наборов, плюс 1.»

То, что вы хотите что-то вроде

int maxsock =0; 
for(i=0; i<3; i++){ 
    FD_SET(sock[i], &sockets); 
    if (sock[i] > maxsock) maxsock = sock[i] 
} 


select(maxsock+1, &sockets, NULL, NULL, NULL);