我正在 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。我知道套接字没问题,因为此时我已经成功通过它发送了数据。
根据select的手册页,
EINVAL
表示“nfds为负数或timeout内包含的值无效”,这表明udpsocket
等于或小于-2
。
一个可能的提示:您在 fd_set 中设置
udpSocket
,然后使用 udpsocket
来计算 maxfd
。有两个仅在单个字符的情况下不同的变量很容易被忽略。
事实证明,错误的原因是我将警报的微秒属性设置为:
alarm.tv_usec = 2000000;
这显然是太高了。显然,将秒属性设置为 2 会更容易:
alarm.tv_sec = 2;