【问题标题】:Breaking out of select for no reason无缘无故跳出选择
【发布时间】:2014-05-11 21:24:29
【问题描述】:

我正在做这样的事情

val = select(max_fd+1,&readfd,0,0,0);
if(val >=1){
    printf("I have got some value");
}

我的代码无缘无故脱离了选择。它没有收到任何数据包。在 10 次运行中,我在等待选择的地方运行 1 次。休息一下就好了。

已设置套接字以接收 ICMP 数据包。在 1 次运行中,它运行良好。为什么这是 9 次?

【问题讨论】:

  • 您使用的是什么平台和选择的实现?
  • 我们不知道这个原因。检查errno
  • 这里没有错误。它脱离了选择,但是当我使用 FD_ISSET 遍历 FD 时,我什么也得不到。我仔细检查了 FD 是否设置正确。
  • 我在linux系统上运行,我不明白你所说的select实现是什么意思

标签: c sockets select-function


【解决方案1】:

我的猜测是您的文件描述符在此过程中已关闭。在这种情况下,val 将为 -1,errno 将设置为 EBADF

【讨论】:

  • 没有问题是 val 设置为 1,即使它们没有数据包
  • 请告诉我们你是如何设置max_fdread_fdFD_ISSET的测试
【解决方案2】:

select() 如果有错误返回 -1。 请检查select()的返回值,如果返回值为-1,请检查errno

【讨论】:

  • 即使没有数据包,它也会返回 1
猜你喜欢
  • 2020-08-17
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
相关资源
最近更新 更多