在UDP套接字上调用select()会产生无效的参数错误

时间:2012-06-07 15:35:46

标签: c sockets select

我在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是正常的,因为此时我已经成功地通过它发送了数据。

2 个答案:

答案 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;