select()系统调用不会解除阻塞

时间:2016-04-01 18:15:21

标签: c sockets networking

我很难让select()系统调用取消阻止。我正在尝试从一组3个插槽中复用数据输入。我为一个名为sock []的int数组中的每个接口创建一个套接字。如果我取消注释第一个块,我可以毫无问题地在每个套接字上接收数据。通过评论它,我永远不会通过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);
        }
    }

1 个答案:

答案 0 :(得分: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);