【发布时间】: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