C 中的连接超时

问题描述 投票:0回答:2

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

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

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

c networking signals posix-select
2个回答
1
投票

不要生成无用的线程,只需保留与每个套接字关联的

lastRecvd
字段即可。然后,给
select()
5 秒的超时时间。选择后,任何不在选择列表中的套接字都需要检查是否已经过了 5 秒。

至于为什么当前代码失败,我怀疑是因为其中一个文件描述符已失效。检查

errno
看看是否是
EBADF


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();
}

这有帮助吗?

© www.soinside.com 2019 - 2024. All rights reserved.