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

在UDP套接字上调用select()会产生无效的参数错误,c,sockets,select,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,

我在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为负值或超时内包含的值无效”,这表明
udpsocket
-2
或更小


一个可能的提示:在fd_集合中设置
udpSocket
,然后使用
udpSocket
计算
maxfd
。只有在单个字符的情况下才有两个不同的变量很容易丢失。

根据select的手册页面,
EINVAL
表示“nfds为负值或超时内包含的值无效”,这表明
udpsocket
-2
或更小


一个可能的提示:在fd_集合中设置
udpSocket
,然后使用
udpSocket
计算
maxfd
。只有在单个字符的情况下才有两个不同的变量很容易出错。

结果表明,产生错误的原因是我将报警的微秒属性设置为:

alarm.tv_usec = 2000000;
这显然是一个太高的值。显然,将seconds属性设置为2更容易:

alarm.tv_sec = 2;

结果表明,出现错误的原因是我将报警的微秒属性设置为:

alarm.tv_usec = 2000000;
这显然是一个太高的值。显然,将seconds属性设置为2更容易:

alarm.tv_sec = 2;

你能用初始化套接字和警报的方式更新这个问题吗?我强烈建议你将
struct timeval alarm
重命名为其他名称,因为正好有一个同名函数(即
alarm()
)你能用初始化套接字和警报的方式更新这个问题吗?我强烈建议你将
struct timeval alarm
重命名为其他名称,因为正好有一个同名函数(即
alarm()