2010-04-13 2 views
1

asyncore 위에 빌드 된 타사 프로토콜 모듈 (SNMP)이 있습니다. asyncore 인터페이스는 응답 메시지를 처리하는 데 사용됩니다. asyncore 메인 루프가 실행되는 동안 프로토콜의 요청 측을 생성하는 클라이언트를 설계하는 적절한 기술은 무엇입니까? 내가 지금 두 가지 옵션을 생각할 수 있습니다 :Python Asyncore로 SNMP 요청 - 응답 서비스 빌드

  1. 루프를 사용 asyncore.loop()의 시간 초과 매개 변수 내 클라이언트 프로그램 시간이 적절한 요청을 보낼 수 있습니다.

  2. 수신기와 같은 asyncore 처리 루프에서 실행될 클라이언트 asyncore 디스패처를 만든다.

어떤 옵션이 가장 좋습니까? 제 2의 솔루션에서 일하고 있는데 프로토콜 API가 asyncore 매개 변수에 직접 액세스하지 못하게합니다. 내가 asyncore를 사용하기위한 적절한 기술을 잘못 이해했다면 나를 바로 잡으십시오.

답변

1

수신자 프로세스의 asyncore 루프에 콜백 함수를 추가하여이 문제를 해결했습니다.

이 솔루션은 내가 (pySNMP) 실험이었다 모듈 다소 특이하지만, 여기에 일반적인 생각입니다 :

  1. dict에 저장된 참조하여 호출 가능한 방법을 반환하는 함수 클로저를 정의 변수는 window입니다. dict은 예상 응답을 추적하고 window은 보낸 사람 버퍼의 크기입니다.

  2. 사용자 정의 된 asyncore.dispatcher 인스턴스에 클로저 함수에 대한 참조를 전달합니다. 콜백 함수는 writeable 메서드 호출에서 실행할 수 있습니다.

  3. 디스패처의 제한 시간을 작은 값으로 설정하십시오. 이렇게하면 수신 된 패킷을 기다리는 동안 asyncore가 너무 오래 차단되지 않습니다. 나는 0.05 초를 사용했다. 당신이 갈수록 앱이 더 많이 응답하지만, 너무 낮게 가지 마십시오.

  4. 갱신 글로벌 dict 구조에서 수신 된 응답을 제거하는 asyncore read_handle 방법. 이렇게하면 새 메시지를 전송할 수 있습니다.

  5. 이제 디스패처와 asyncore의 모든 루프를 시작하면 시스템이 콜백 함수를 호출하고 정의 된 창 크기까지 모든 메시지를 보냅니다.