我有一个运行在嵌入式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
超时时间当然是一个空指针,表示应该一直阻塞,直到其中一个套接字可读。问题是:无论我是否连接到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,这是“与此套接字连接的用户程序未复制的字节数”的计数。
有人知道可能出了什么问题,或者我该如何排除故障?
socket
在这里得到了一个错误的值。 - caf