4

我有一个在嵌入式 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,即“连接到此套接字的用户程序未复制的字节数”。

有谁知道可能会发生什么,或者我如何解决这个问题?

4

1 回答 1

2

该代码看起来很可靠。我有点好奇你为什么要投到unsigned int,但它不应该伤害任何东西。

一些想法:

它没有挂在你认为的地方。希望您已经对此进行了两次/三次检查。(再检查一遍?)

您的 netstat 解释是错误的。如手册页所述,该部分用于“已建立”套接字-您的是侦听器,即下一句:“侦听:自内核 2.6.18 以来,此列包含当前的 syn backlog。”

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

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

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

于 2010-06-05T00:39:27.963 回答