我很难让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);
}
}
答案 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);