0

我在 UDP 套接字上调用 select() 以查看是否有要读取的数据。每次方法返回 -1 并且 errno 设置为 22(无效参数)。这是我的代码的一部分:

fd_set sockets;
struct timeval alarm;
alarm.tv_sec = 0;
alarm.tv_usec = 1000;
FD_ZERO(&sockets);
FD_SET(udpSocket, &sockets);
maxfd = udpsocket + 1;
selected = select(maxfd, &sockets, NULL, NULL, &alarm);
printf("%d\n", selected);

“选定”始终为 -1。我知道套接字很好,因为此时我已经成功地通过它发送了数据。

4

2 回答 2

2

根据select的手册页,EINVAL意思是“nfds为负或超时中包含的值无效”,这表明udpsocket-2或更少。

一个可能的提示:您udpSocket在 fd_set 中设置,然后使用udpsocket来计算maxfd. 有两个仅在单个字符的情况下不同的变量很容易被忽略。

于 2012-06-07T16:29:38.637 回答
2

事实证明,错误的原因是我将警报的微秒属性设置为:

alarm.tv_usec = 2000000;

这显然是太高的价值。显然,将 seconds 属性设置为 2 更容易:

alarm.tv_sec = 2;
于 2012-06-07T18:03:57.353 回答