select()无限期挂起

时间:2010-06-04 23:56:43

标签: c++ networking select rtsp

我有一个在嵌入式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

超时当然是一个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,这是“连接到此套接字的用户程序未复制的字节数。”

有没有人知道南方会发生什么,或者我如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

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

一些想法:

它不会挂在你认为的地方。希望你有双重/三重检查。 (再次检查?)

您的netstat解释错误。正如手册页所说,那部分用于“已建立”套接字 - 你的是一个监听器,这是下一句话:“听力:从内核2.6.18开始,这一列包含当前的syn backlog。”

这看起来像是一个巨大的积压......这让我觉得你不接受() - 也许是因为你陷入了select()。那个你的侦听套接字上的select()吗?

最后,请仔细检查您是否在右侧套接字上调用select()。即,打印出套接字arg,并查看它是否应该是它。

基本上,验证:1)它是挂在select()和2)选择的参数是正确的。我怀疑其中一个不是真的。