我有一個運行在嵌入式linux(較舊的內核,2.6.18)上的應用程序。我正在使用Live555。有時,當攝像機負載過重時,我的RTSP服務器(使用Live555構建)將無限期地掛起 - 無法連接或調用似乎使其無法啓動,無法重置應用程序。select()無限期懸掛
我收窄垂下到該代碼:
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
當它處於故障狀態,我總能看到21上的Recv-Q,這是「沒有的字節數由連接到此套接字的用戶程序複製「。
有沒有人有任何想法可能會南下,或者我該如何解決這個問題?
「是*插座*聽/接受插座?」是我的第一個想法。 – 2010-06-05 01:30:39
是的,我的懷疑是'套接字'在這裏結束了一個不正確的值。 – caf 2010-06-06 05:19:51
感謝Thanatos。 FWIW,這不是我的代碼 - 它是開源RTSP庫Live555的一部分。 我認爲它掛在選擇()。我不是積極的選擇的論據是正確的,所以我會驗證。並感謝netstat變化的負責人。 – kidjan 2010-06-06 20:13:56