C中连接的超时

时间:2012-04-01 04:02:21

标签: c networking select signals

我的程序最多接受4个连接(使用select功能)。一旦他们连接,他们有5秒钟发送一个字符串,表明他们想要保持连接。那些未在5秒内发送或密码错误的用户将被断开连接。

我创建了一个小型计时器程序,只要建立连接就会分叉。如果5秒钟消失,分叉计时器将向原始程序发回信号。在这种情况下,信号处理程序将关闭文件描述符,并清除连接。

我的问题是,每当触发信号处理程序时,select()返回-1,表示它已失败。有谁知道为什么会这样?或者,如果有其他计时机制我可以使用?

由于

2 个答案:

答案 0 :(得分:1)

不要生成无用的线程,只需保留与每个套接字关联的lastRecvd字段。然后,只需给select() 5秒超时。选择后,任何不在选择列表中的套接字都需要检查它是否为5秒。

至于为什么它失败了你当前的代码,我怀疑这是因为其中一个文件描述符被无效。检查errno,看看它是EBADF

答案 1 :(得分:0)

我相信这是select()的预期行为:如果发生信号,则返回-1并正确设置errno。

我不认为线程是去这里的方式。我假设你想要一个大致有这种结构的程序(原谅java-esque命名,但你明白了):

int fdsThatResponded[FDCOUNT];
memset(fdsThatResponded, 0, sizeof(int)*FDCOUNT);

while (time_elapsed < 5) {
    ret = select(......);
    if (-1 == ret) {
        handleError();
    }
    checkWhichFdAndHandleAppropriately();
    reinitializeTimerForSelectWithRemainingTime();
}

这有帮助吗?