我的程序最多接受 4 个连接(使用选择功能)。连接后,他们有 5 秒的时间发送字符串,表明他们希望保持连接。 5秒内未发送或密码错误的将被断开连接。
我创建了一个小型计时器程序,每当建立连接时就会分叉。如果 5 秒过去,分叉的计时器将向原始程序发送回信号。在这种情况下,信号处理程序将关闭文件描述符,并清除连接。
我的问题是,每当触发信号处理程序时,select()都会返回-1,表明它失败了。有谁知道为什么会发生这种情况?或者如果我可以使用另一种计时机制?
不要生成无用的线程,只需保留与每个套接字关联的
lastRecvd
字段即可。然后,给 select()
5 秒的超时时间。选择后,任何不在选择列表中的套接字都需要检查是否已经过了 5 秒。
至于为什么当前代码失败,我怀疑是因为其中一个文件描述符已失效。检查
errno
看看是否是 EBADF
。
我相信这是
select()
的预期行为:如果出现信号,则返回 -1 并适当设置 errno。
我不认为线程是解决问题的方法。我假设你想要一个具有大致这种结构的程序(请原谅 java 式的命名,但你明白了):
int fdsThatResponded[FDCOUNT];
memset(fdsThatResponded, 0, sizeof(int)*FDCOUNT);
while (time_elapsed < 5) {
ret = select(......);
if (-1 == ret) {
handleError();
}
checkWhichFdAndHandleAppropriately();
reinitializeTimerForSelectWithRemainingTime();
}
这有帮助吗?