gpt4 book ai didi

c++ - select() 无限期挂起

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:13:34 25 4
gpt4 key购买 nike

我有一个在嵌入式 Linux(旧内核,2.6.18)上运行的应用程序。我正在使用 Live555。有时,当相机负载过重时,我的 RTSP 服务器(使用 Live555 构建)将无限期挂起——除了重置应用程序之外,似乎没有任何连接或哄骗让它突然退出。

我将问题缩小到这段代码:

static int blockUntilReadable(UsageEnvironment& env,
int socket, struct timeval* timeout) {
int result = -1;
do {
fd_set rd_set;
FD_ZERO(&rd_set);
if (socket < 0) break;
FD_SET((unsigned) socket, &rd_set);
const unsigned numFds = socket+1;

result = select(numFds, &rd_set, NULL, NULL, timeout); <--HANG

当然,timeout 是一个 NULL 指针,表示它应该阻塞,直到其中一个套接字可读为止。问题是:我是否连接到 RTSP 服务器并不重要——它只是无限期地阻塞。

我做了一个 netstat -an,它总是输出如下内容:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:5222 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:5800 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:5802 0.0.0.0:* LISTEN
tcp 21 0 0.0.0.0:554 0.0.0.0:* LISTEN

当它处于失败状态时,我总是在 Recv-Q 上看到 21,即“连接到此套接字的用户程序未复制的字节数”。

有没有人知道可能会出现什么问题,或者我该如何解决这个问题?

最佳答案

该代码看起来很可靠。我有点好奇您为什么要强制转换为 unsigned int,但这应该不会有任何伤害。

一些想法:

它并没有卡在你认为的地方。希望你已经双重/三次检查过这个。 (再检查一遍?)

您的 netstat 解释是错误的。正如手册页所指出的,那部分是针对“已建立”套接字的——你的是一个监听器,也就是下一句:“监听:自内核 2.6.18 起,此列包含当前的 syn 积压工作。”

这看起来像是一个巨大的积压......这让我认为你没有接受()-ing,也许是因为你被困在 select()。那您监听套接字上的 select() 对吗?

最后,仔细检查您是否在正确的套接字上调用 select()。即,打印出那个套接字 arg,看看它是否是它应该的样子。

本质上,验证:1) 它卡在 select() 中,以及 2) 选择的参数是否正确。我怀疑这两个中的一个不是真的。

关于c++ - select() 无限期挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2978488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com