我有一个在嵌入式 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,即“连接到此套接字的用户程序未复制的字节数”。
有谁知道可能会发生什么,或者我如何解决这个问题?