在 UDP 套接字上调用 select() 会出现无效参数错误

问题描述 投票:0回答:2

我正在 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。我知道套接字没问题,因为此时我已经成功通过它发送了数据。

c sockets posix-select
2个回答
2
投票

根据select的手册页,

EINVAL
表示“nfds为负数或timeout内包含的值无效”,这表明
udpsocket
等于或小于
-2

一个可能的提示:您在 fd_set 中设置

udpSocket
,然后使用
udpsocket
来计算
maxfd
。有两个仅在单个字符的情况下不同的变量很容易被忽略。


2
投票

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

alarm.tv_usec = 2000000;

这显然是太高了。显然,将秒属性设置为 2 会更容易:

alarm.tv_sec = 2;
© www.soinside.com 2019 - 2024. All rights reserved.