2014-12-19 4 views
0

블로킹 소켓을 사용하고 있는데 recv()에 관해 꽤 혼란 스럽습니다. 공식적인 사람은 나에게 제한된 것 같습니다. 다른 점은 인터넷을 사용하는 사람들 (그리고이 사이트에서도)은 소켓 차단에 대한 예외를 발생시키지 않는다는 것입니다. 잔인하게 서버를 닫으면 Errno 10054 (socket.error)가 대신 throw됩니다.socket.recv()는 예외를 언제 발생합니까?

+0

연결이 종료 된 경우가 분명히 기다릴 수 있습니다. 어떻게 든 이벤트에 대해 알려야합니다. 여기에 놀라움이 없습니다. –

답변

1

간단히 말해서 recv은 기본 소켓 작업이 실패 할 때마다 예외를 throw합니다. 문제는 당신이있는 OS에 달려 있다는 것입니다. 10054가 연결 재설정을위한 Windows error code이기 때문에 나는 당신이 Windows에 있다고 추측 할 수 있습니다. 다행히 때 소켓 작업 (자세한 내용은 Windows documentation 확인) 운영체제 사이에 대략 일치에 실패하고, 파이썬은 오류를 식별 할 수있는 휴대용 솔루션 이유 :

import errno 
... 
if err == errno.ECONNRESET : 
    print "connection reset" 
+0

그래서 어떤 경우에 빈 문자열을 반환합니까? –

+0

언제 기다리고 있니? –

+0

@MarcoFazio 100 % 확신 할 수는 없지만 데이터가 수신되거나 오류가 발생하거나 연결이 정상적으로 닫힐 때까지 기다리는 것이 좋습니다. 빈 문자열은 연결이 정상적으로 닫힌 경우에만 사용해야하지만 확실히 테스트해야합니다. – ElderBug