2012-04-01 135 views
2

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

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

我的问题是,无论何时触发信号处理程序,select()返回-1,表示它失败。有谁知道为什么会发生这种情况?或者如果有另一种时间机制我可以使用?

感谢

+1

当select返回-1时,errno是什么?这是你最大的暗示。 – Duck 2012-04-01 04:17:17

回答

0

我相信这是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(); 
} 

是否帮助呢?

1

产卵而不是一个无用的线程,只保留每个插槽相关的lastRecvd场。然后,只需给予select() 5秒的超时时间。选择后,任何不在选择列表中的套接字将需要检查它是否已经过5秒。

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