2010-02-01 6 views
0

그래서, 나는 다음과 같은 코드가 반환하지 :루비 TCPSocket의 recv를 차단 결코

def LSCPHandler.send_message(message, hostname, port) 
s = TCPSocket.open(hostname, port) 
s.print message 
ret = s.recv(1024) 
s.close 
LSCPHandler.parse_error(ret) 
return ret 

정상적으로 잘 작동합니다. 내가 말하고있는 서버는 응답을 매우 신속하게 반환합니다. 일반적으로 모든 것이 잘됩니다.

그런데 오늘 서버에 문제가 발생했습니다. 내 문제는 아니지만,이 때문에 전체 응용 프로그램이 멈추고, 시간 초과로 recv 기다리고 있습니다. 이것은 정확히 최적이 아닙니다.

내가 '다시 돌아 오는 소리가 들리지 않으면 recv 시간 초과 방법이 있습니까? 나는 루비 문서를 보았지만 정말 혼란 스럽다. (즉, TCPSocket은 세 가지 메소드 만 구현한다. 아무 것도 열거 나 recv가 없으며 Socket의 부모 클래스는이 메소드를 구현하지 않는다.) 그리고 Socket의 부모 클래스는 Object ? 완전히 혼란 스러워요.)

답변

2

소켓의 수신 제한 시간 소켓 옵션을 기본값 이외의 값으로 설정할 수 있습니다. 까다로운 부분은 모든 사용 사례에서 여전히 작동하는 적절한 숫자를 선택하는 것입니다. 즉, recv 호출이 너무 일찍 종료되기를 원하지 않습니다.

s.setsockopt(Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, <timeout>)