2010-06-04 65 views
4

我有一個運行在嵌入式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,這是「沒有的字節數由連接到此套接字的用戶程序複製「。

有沒有人有任何想法可能會南下,或者我該如何解決這個問題?

回答

2

該代碼看起來非常穩固。我有點好奇你爲什麼要投,但它不應該傷害任何東西。

一些想法:

它不是掛在你認爲它的地方。希望你已經雙倍/三倍檢查了這一點。 (再次檢查它?)

你的netstat解釋是錯誤的。正如手冊頁所記錄的那樣,該部分是針對「已建立」的套接字 - 您的是一個監聽器,這是下一句話:「監聽:自Kernel 2.6.18以來,此列包含當前的syn backlog。」

這看起來像一個巨大的積壓......這導致我認爲你不接受() - ing,也許是因爲你卡在select()中。那 select()在你的監聽套接字上嗎?

最後,請仔細檢查您是否在正確的插座上調用select()。即打印出該套接字arg,並查看它是否應該是。

本質上,驗證:1)它掛在select()和2)參數選擇是正確的。我懷疑其中的一個是不正確的。

+0

「是*插座*聽/接受插座?」是我的第一個想法。 – 2010-06-05 01:30:39

+0

是的,我的懷疑是'套接字'在這裏結束了一個不正確的值。 – caf 2010-06-06 05:19:51

+0

感謝Thanatos。 FWIW,這不是我的代碼 - 它是開源RTSP庫Live555的一部分。 我認爲它掛在選擇()。我不是積極的選擇的論據是正確的,所以我會驗證。並感謝netstat變化的負責人。 – kidjan 2010-06-06 20:13:56