【发布时间】:2016-04-01 18:15:20
【问题描述】:
我无法让 select() 系统调用解除阻塞。我正在尝试从一组 3 个套接字多路复用数据输入。我在称为 sock[] 的整数数组中为每个接口创建一个套接字。如果我取消注释第一个块,我可以毫无问题地在每个套接字上接收数据。使用 cmets,我永远不会通过对 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 - 不幸的是,我认为
select仍然是最便携的,所以在某些情况下使用它可能是合理的。也就是说,poll是我的简单用法。epoll更强大,但更难使用且仅限 Linux。 -
@BrianMcFarland,我不知道有任何现代系统有
select,但没有poll。你有具体的例子吗?epoll当然是特定于 Linux 的。 -
唯一立即想到的是轻量级/备用 TCP/IP 堆栈,例如lwIP 和类似的商业解决方案。虽然有点谷歌搜索,但听起来所有主要操作系统在大约 10 年前都支持它(Win Vista 和 OSX 10.4),这意味着运行仍然受支持的操作系统版本的系统很少(如果有的话?)问题。
标签: c sockets networking