2011-01-26 2 views
2

(Linux, Windows 및 OSX에서 CPython v2.6을 사용하고 있습니다.하지만 내 질문이 Python 또는 대상 시스템에만 해당한다고 생각하지 않습니다.)select()에 따라 읽을 수있는 오류 상태의 소켓이 있습니까?

내 응용 프로그램이 select([sock], [], [], None) 전화가 걸리고 원격 쪽이 갑자기 중지되면 오류를 선택하지 않아도 선택 통화를 차단 해제해도됩니까?

이 작업을 수행하는 적절한 방법은 소켓의 오류 (예 : select([sock], [], [sock], None))도 확인하는 것이지만, 내가 읽은 문서 인 select은 시스템에 따라 오류 정의가 다르다고합니다.

+1

세 번째 세트는 실제로는 오류라고는하지 않지만 실제로는 오류가 아닙니다. TCP 긴급 데이터와 같은 예외적 인 상황입니다. 읽을 수있는 세트에 표시 될 읽기 오류/원격 연결이있는 경우 – mark4o

답변

2

맨 페이지를 읽는 방법에 따라 select()의이 영역에 조금 희미한 부분이 있기 때문에 "구현에 따라 달라질 수 있습니다"라는 것이 어느 정도 확실하지 않지만, 필자가 작업 한 시스템은 소켓을 읽을 수있는 상태로 만든 다음 읽기가 오류를 반환합니다 (이 경우 TCP는 물론이고 원격 측에는 연결이 RST라고 가정합니다.) 핵심 부분은 "해당 I/O 작업을 수행 할 수 있으면 설명자가 준비 상태로 간주됩니다 (예 : , 읽기 (2)) 차단하지 않고. " read가 즉시 오류와 함께 반환되면 true 진술이됩니다. 간단한 클라이언트 서버를 작성하고 클라이언트를 연결 한 다음 읽기를 선택하여 대상 시스템에서이 동작을 확인하는 것이 좋습니다. 서버를 수락하고 잠시 대기 한 다음 종료하십시오. 내가 일반적으로 본 것이 표준이라면, select는 소켓을 읽을 수있는 상태로 반환 할 것이고, 읽기는 차단되지 않지만 연결 재설정 오류를 반환 할 것이다. 리눅스에서

(linux man pages에서)

아, 네, 그냥 만드는 문제 악화, 선택() "읽기위한 준비"로 소켓 파일 디스크립터를보고 할 수 있습니다,하지만 그럼에도 불구하고 후속 읽기 블록. 예를 들어 데이터가 도착했지만 검사에서 잘못된 체크섬이있어 폐기 될 수 있습니다. 파일 디스크립터가 준비되어있는 것처럼 위장적으로보고되는 다른 상황이있을 수 있습니다. 따라서 차단해서는 안되는 소켓에 O_NONBLOCK을 사용하는 것이 더 안전 할 수 있습니다.

관련 문제