我的程序最多接受4个连接(使用select功能)。一旦他们连接,他们有5秒钟发送一个字符串,表明他们想要保持连接。那些未在5秒内发送或密码错误的用户将被断开连接。
我创建了一个小型计时器程序,只要建立连接就会分叉。如果5秒钟消失,分叉计时器将向原始程序发回信号。在这种情况下,信号处理程序将关闭文件描述符,并清除连接。
我的问题是,每当触发信号处理程序时,select()返回-1,表示它已失败。有谁知道为什么会这样?或者,如果有其他计时机制我可以使用?
由于
答案 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();
}
这有帮助吗?