我有一个在嵌入式
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,即“连接到此套接字的用户程序未复制的字节数”.
有没有人知道南方会发生什么,或者我如何解决这个问题?
最佳答案 该代码看起来非常可靠.我有点好奇为什么你要转换为unsigned int,但它不应该伤害任何东西.
一些想法:
它并没有悬挂在您认为的位置.希望你有双重/三重检查. (再次检查?)
你的netstat解释是错误的.正如手册页所说,那部分用于“已建立”套接字 – 你的是一个监听器,这是下一句话:“听力:从内核2.6.18开始,这个列包含当前的syn backlog.”
这看起来像是一个巨大的积压……这让我觉得你不接受() – 也许是因为你陷入了select().那就是你的侦听套接字上的select()吧?
最后,仔细检查您是否在右侧套接字上调用select().即,打印出套接字arg,并查看它是否应该是什么.
基本上,验证:1)它是挂在select()和2)选择的参数是正确的.我怀疑其中一个不是真的.