select()用于超时

Kes*_*sav 6 c select sftp network-programming

我只能在select()API中将最大值设置为20秒作为timeout参数.无论我在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)
Run Code Online (Sandbox Code Playgroud)

请帮帮我......我会以正确的方式去吗?如果是这样,选择在第一次超时后返回1.请帮我解决这个问题注意:我在目标C中使用它

Jer*_*ner 10

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

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

  • 当然,它可以做到这一点; 特别是TCP套接字最终可能会超时尝试发送,然后select()将返回套接字标记为ready-for-read,然后read()/ recv()将返回错误以指示TCP连接是破碎.我不确定UDP套接字是否也会这样做,但它可能会. (3认同)