2013-03-04 7 views
0

저는 소켓 프로그래밍 (그리고 다소 파이썬에 대해서도)에 익숙하지 않습니다. 그리고 (서버 측에서) 원하는 방식대로 작동하도록 선택 타임 아웃을 얻는 데 문제가 있습니다. 클라이언트가 연결되기 전에 시간 초과는 정상적으로 작동합니다. 나는 1 초의 값을주고, 1 초마다 타임 아웃이 끝난다.select에서 timeout 매개 변수를 올바르게 사용하는 방법은 무엇입니까?

일단 클라이언트가 연결되면 제한 시간이 만료되었음을 알리기 위해 1 초 정도 기다리지 않습니다. 최대한 빨리 루프를 실행하고 제한 시간이 만료되었다고 알려줍니다. 여기에 내 코드의 조각이다 : 이것은 내 문제가 어디에 있는지 충분한 코드 인 경우

while running: 
    try: 
     self.timeout_expired = False 
     inputready, outputready, exceptready = select.select(self.inputs, self.outputs, [], self.timeout) 
    except select.error, e: 
     break 
    except socket.error, e: 
     break 

    if not (inputready): 
     # Timeout expired 
     print 'Timeout expired' 
     self.timeout_expired = True 

    # Additional processing follows here 

잘 모르겠어요, 그래서 당신은 더 볼 필요가 있다면 알려 주시기 바랍니다. 기본적으로 클라이언트가 연결되면 최소한 으로 표시되어 1 초의 시간 제한을 무시하고 가능한 한 빨리 실행되며 "시간 초과가 만료되었습니다."라고 계속해서 알려줍니다. 내가 뭘 놓쳤는가?

감사합니다.

편집 : 분명히해야합니다 ... "inputready"는 서버에 연결하거나 서버로 데이터를 보내는 클라이언트의 입력과 서버의 표준 입력을 나타냅니다. select에서 반환 된 다른 변수는 서버 측 변수 일 뿐이며, CLIENT가 응답하는 데 너무 오래 걸리는지 여부를 감지하기 위해 노력하고 있으므로 inputready가 비어 있는지 확인합니다.

+0

그리고 만약'이미 입력 됐습니까? ' –

+0

inputready 인 경우 서버는 inputready에있는 각 소켓을 반복하고 추가 처리를 수행합니다. – MattM

답변

1

inputready, outputreadyexceptready이 모두 비어있는 경우에만 시간 초과가됩니다. 내 생각 엔 클라이언트 소켓을 self.inputsself.outputs에 모두 추가 한 것입니다. 출력 소켓은 일반적으로 쓸 수 있기 때문에 항상 outputready에 표시됩니다. 무언가를 출력 할 준비가되면 클라이언트 소켓을 self.outputs에 추가하십시오.

+0

아, 감사합니다. 그래, 네 추측이 자리 잡았어. self.outputs를 사용하여 준비가되었을 때 메시지를 보낼 사람을 쉽게 추적합니다. 나는 모든 클라이언트에게 뭔가를 출력 할 준비가되면 self.inputs를 반복하여 self.outputs에 추가 할 수 있다고 생각합니다. 시간 내 주셔서 감사합니다! – MattM

+0

나는 다른 변수의 출력을 채우고 메시지를 보내기 전에 self.outputs에 모두 던져 버렸다. 고맙게도 그 모든 것이 한 곳에서 이루어질 수있었습니다. "<그렇지 않으면 정말 고통이었을 것입니다. 당신의 도움을 주셔서 감사합니다! 내가 지금 이걸 고치지 않았다면 길을 나서는 시간을 절약 해 줬어. – MattM

관련 문제