C中的连接超时

C中的连接超时,c,networking,select,signals,C,Networking,Select,Signals,我的程序最多可接受4个连接(使用选择功能)。一旦连接,他们有5秒钟的时间发送一个字符串,表示他们希望保持连接。那些在5秒内未发送或密码错误的将被断开连接。 我已经创建了一个小的计时器程序,它在建立连接时被分叉。如果5秒过去,分叉定时器将向原始程序发回信号。在这种情况下,信号处理程序将关闭文件描述符,并清除连接 我的问题是,每当触发信号处理程序时,select()返回-1,表示它失败了。有人知道为什么会这样吗?或者如果我可以使用另一种计时机制 谢谢,不要产生无用的线程,只需保留一个与每个套接字关联

我的程序最多可接受4个连接(使用选择功能)。一旦连接,他们有5秒钟的时间发送一个字符串,表示他们希望保持连接。那些在5秒内未发送或密码错误的将被断开连接。

我已经创建了一个小的计时器程序,它在建立连接时被分叉。如果5秒过去,分叉定时器将向原始程序发回信号。在这种情况下,信号处理程序将关闭文件描述符,并清除连接

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


谢谢,不要产生无用的线程,只需保留一个与每个套接字关联的
lastRecvd
字段即可。然后,只需给
select()
一个5秒的超时时间。选择后,任何不在选择列表中的插座都需要检查是否已使用5秒


至于您当前代码失败的原因,我怀疑是因为其中一个文件描述符正在失效。检查
errno
并查看它是否为
EBADF

我相信这是
select()
的预期行为:如果出现信号,返回-1并适当设置errno

我不认为线程是在这里的方式。我假设您想要一个大致具有这种结构的程序(请原谅java风格的命名,但您明白了这一点):

int fdsthat响应[FDCOUNT];
memset(fdsthatfresponsed,0,sizeof(int)*FDCOUNT);
时(所用时间<5){
ret=选择(……);
如果(-1==ret){
handleError();
}
检查是否正确地进行了处理();
使用RemainingTime()重新初始化Timer选项;
}

这有帮助吗?

当select返回-1时,errno是什么?这是你最大的暗示。
int fdsThatResponded[FDCOUNT];
memset(fdsThatResponded, 0, sizeof(int)*FDCOUNT);

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