임베디드 리눅스 (구형 커널, 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 참조, "바이트 수없는 이 소켓에 연결된 사용자 프로그램에 의해 복사됩니다. "
누구에게 무슨 일이 일어나고 있는지, 또는이 문제를 어떻게 해결할 수 있습니까?
"* 소켓 * 수신/수신 소켓입니까?"라는 것이 나도 처음 생각했습니다. –
예, '소켓'이 잘못된 값으로 끝나고 있다는 의혹이 있습니다. – caf
감사 Thanatos. FWIW, 이것은 내 코드가 아닙니다. 오픈 소스 RTSP lib, Live555의 일부입니다. select()에 걸려 있다고 확신합니다. 나는 선택의 논쟁이 옳다는 것을 긍정적으로 밝히지 않았으므로 그것을 검증 할 것입니다. 그리고 netstat 변경에 머리를 주셔서 감사합니다. – kidjan