【问题标题】:Usage of select() for timeout使用 select() 进行超时
【发布时间】:2012-03-21 05:12:58
【问题描述】:

我只能在 select () API 中设置最大 20 秒作为超时参数。无论我给出的值超过 20,select() 都会在 20 秒后返回...... 所以我试图为这样的 1 分钟超时编写一个循环

    int timeoutcount = 0;
    do
    {
    FD_ZERO(&fd);
    FD_SET(sock,&fd);
    timeout.tv_sec = 20;
    timeout.tv_usec = 0;
    rc = select (sock+1,&fd,null,null,&timeout);
    if(rc ==0)
    timeoutcount += 20;
    }
    while(rc ==0 && timeoutcount <60)

请帮帮我...我走对了吗? 如果是这样,select 在第一次超时后返回 1..帮助我也解决这个问题 注意:我在目标 C 中使用它

【问题讨论】:

  • 你怎么知道你正在超时,而不是在 sock 上收到事件?
  • @nos 当我第一次尝试时,我将超时设置为 60 秒。尽管我的网络电缆已拔下,但我在 20 秒后自己在“袜子”上收到了事件。之后,当我将超时设置为 20 秒时,它工作正常..
  • 好吧,你需要处理套接字事件。无论您的电缆是否已拔下。您可能会收到一个事件,因为它被拔掉了,或者在套接字级别超时,这取决于您在做什么。选择在以下情况下返回:套接字有事件,或者发生超时。 select() 完全按照宣传的方式工作。如果您不处理套接字事件,则下次在该套接字上调用 select 时只会得到相同的事件。
  • @nos 我接受。但是我可以知道为什么 select() 会在 22 秒时返回一个事件,尽管我的超时时间是 60 秒(P.S 在我测试这个案例时我的网络电缆被拔掉了)。
  • 因为当时socket上发生了一个事件。您需要处理该事件,即:从套接字读取()以了解为什么会发生事件。套接字上的事件和要选择的超时参数没有任何关系,除非在该时间内没有任何套接字发生事件,否则将触发超时。

标签: c select network-programming sftp


【解决方案1】:

选择超时没有 20 秒的最大值 - 其他东西(很可能是您的套接字上准备好读取的数据)一定是导致 select() 提前返回。如果您真的只想使用 select() 作为一种睡眠方式,请尝试这样调用它:

struct timeval tv = {600, 0};   // sleep for ten minutes!
if (select(0, NULL, NULL, NULL, &tv) < 0) perror("select");

【讨论】:

  • 我不想使用选择作为睡眠功能。它应该在套接字上等待超时事件。
  • select() 将在注册的套接字上发生事件时立即返回,或者如果没有套接字事件发生,那么它将在您的超时值指示的时间过去后返回。因此,如果您想处理套接字事件并获得超时,则需要在套接字事件发生时对其进行处理,然后再次调用 select()(适当减小超时值)。
  • 我有一个基本的疑问。即使没有网络连接,Select() 会返回一些事件吗?
  • 当然可以;特别是 TCP 套接字最终可能会在尝试发送时超时,然后 select() 将返回标记为准备读取的套接字,然后 read()/recv() 将返回一个错误以指示 TCP 连接已破碎的。我不确定 UDP 套接字是否会这样做,但它可能会。
猜你喜欢
  • 2019-05-30
  • 1970-01-01
  • 2012-02-13
  • 2019-09-25
  • 2015-05-28
  • 1970-01-01
  • 2020-03-30
  • 2015-10-19
  • 1970-01-01
相关资源
最近更新 更多