2010-06-04 4 views
4

임베디드 리눅스 (구형 커널, 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 

, 나는 항상에 수신 된-Q에 21 참조, "바이트 수없는 이 소켓에 연결된 사용자 프로그램에 의해 복사됩니다. "

누구에게 무슨 일이 일어나고 있는지, 또는이 문제를 어떻게 해결할 수 있습니까?

답변

2

그 코드는 상당히 견고합니다. 나는 왜 당신이 unsigned int에 캐스팅하는지에 대해 조금 궁금해하지만, 아무런 상처를 입어서는 안됩니다.

일부 생각 :

생각하는 곳에 매달 리지 않습니다. 바라기를 두 번이나 트리플을 체크했기를 바랍니다. (다시 확인하십시오)

귀하의 netstat 해석이 잘못되었습니다. 이 부분은 맨 페이지 노트와 같이 "Established"소켓을위한 것이고 다음은 리스너입니다 : "Listening : Kernel 2.6.18부터이 컬럼은 현재 syn 백 로그를 포함하고 있습니다."

엄청난 양의 백 로그처럼 보입니다. select()에 집착했기 때문에 받아들이지 않는 것으로 생각됩니다. 입니다. 청취 소켓의 select()는 맞습니까?

마지막으로 을 선택하고 오른쪽 소켓에서 select()를 호출했는지 확인하십시오. 즉, 소켓 arg를 출력하고 그것이 필요한 것인지를 확인하십시오.

기본적으로 다음을 확인하십시오. 1) select()에서 걸려 있고 2) 선택하려는 인수가 올바른지 확인하십시오. 그 둘 중 하나가 사실이 아닌 것 같습니다.

+0

"* 소켓 * 수신/수신 소켓입니까?"라는 것이 나도 처음 생각했습니다. –

+0

예, '소켓'이 잘못된 값으로 끝나고 있다는 의혹이 있습니다. – caf

+0

감사 Thanatos. FWIW, 이것은 내 코드가 아닙니다. 오픈 소스 RTSP lib, Live555의 일부입니다. select()에 걸려 있다고 확신합니다. 나는 선택의 논쟁이 옳다는 것을 긍정적으로 밝히지 않았으므로 그것을 검증 할 것입니다. 그리고 netstat 변경에 머리를 주셔서 감사합니다. – kidjan

관련 문제