我在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。我知道socket是正常的,因为此时我已经成功地通过它发送了数据。
答案 0 :(得分:2)
加入select的手册页,EINVAL
表示“nfds为负数或超时内包含的值无效”,表示udpsocket
为-2
或更少。
一个可能的提示:您在fd_set中设置udpSocket
,然后使用udpsocket
来计算maxfd
。只有单个字符的两个变量才会有所不同。
答案 1 :(得分:2)
事实证明,错误的原因是我将警报的microseconds属性设置为:
alarm.tv_usec = 2000000;
显然价值太高了。显然,将seconds属性设置为2更容易:
alarm.tv_sec = 2;