【问题标题】:Calling select() on a UDP socket gives an invalid argument error在 UDP 套接字上调用 select() 会导致参数无效错误
【发布时间】:2012-06-07 15:35:45
【问题描述】:

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

【问题讨论】:

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

标签: c sockets select


【解决方案1】:

根据select的manual page,EINVAL的意思是“nfds为负或timeout中包含的值无效”,这表明udpsocket-2或更少。

一个可能的提示:您在 fd_set 中设置udpSocket,然后使用udpsocket 计算maxfd。有两个仅在单个字符的情况下不同的变量很容易被忽略。

【讨论】:

    【解决方案2】:

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

    alarm.tv_usec = 2000000;
    

    这显然是一个太高的价值。显然,将 seconds 属性设置为 2 更容易:

    alarm.tv_sec = 2;
    

    【讨论】:

      猜你喜欢
      • 2018-06-16
      • 2014-01-04
      • 2015-07-28
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多