2011-01-26 7 views
-2

나는 MSDN documentation for IcmpSendEcho2을 읽었으며 대답보다 많은 질문을 제기합니다. 나는 그런 ReadFileEx 같은 다른는 Win32 API를에서 비동기 콜백을 잘 알고있어비동기 콜백을 사용하는 IcmpSendEcho2의 사용

... 나는 내가 작업이 IO_PENDING 이외의 결과를 완료 할 때까지 드라이버의 사용을 위해 예약 보장 버퍼를 제공, 내 콜백을 얻을 성공 또는 실패한 경우 (그리고 어떤 것을 찾으려면 GetCompletionStatus로 전화하십시오.) 시간 초과는 제 책임이며 처리를 중단하기 위해 CancelIo으로 호출 할 수 있지만, 드라이버는 작업을 취소하고 CANCELLED 상태의 완료 루틴을 호출 할 때까지 버퍼가 여전히 예약되어 있습니다. 그리고이 모든 것을 통해 요청을 고유하게 식별하는 OVERLAPPED 구조가 있습니다.

IcmpSendEcho2은 비동기 요청에 대해 OVERLAPPED 컨텍스트 구조를 사용하지 않습니다. 그리고 문서가 불투명 과도하게 최소 인 핑이 시간 초과되거나 실패 할 경우 (네트워크 연결 부족, 로컬 피어에 대한 ARP 항목 누락, 원격 피어에 대한 중간 라우터에서의 ICMP 대상 도달 불가능 응답) , 등).

누군가 콜백이 시간 초과 및/또는 실패시 발생하는지 여부를 아는 사람이 있습니까? 특히 응답이 없다면 IcmpSendEcho2으로 또 다른 호출을 위해 버퍼를 재사용 할 수 있습니까, 아니면 늦게 응답이 왔을 때를 위해 영원히 예약되어 있습니까?

Win32 서비스에서이 함수를 사용하고 싶습니다. 즉, 오류 처리 사례를 올바르게 가져와야하고 버퍼가 누출 될 수 없거나 API에서 누출 버퍼가있는 경우 사용해야합니다. 도우미 프로세스이므로 요청을 포기할 수있는 방법이 있습니다.)

콜백이 이루어지는 방식에보기 흉한 비 호환성이 있습니다. 첫 번째 매개 변수가 두 서명 사이에 일관성이있는 것처럼 보입니다. 따라서 OS 버전 확인이 Vista 이상을 반환하는 경우 두 번째 매개 변수 만 사용하는 한 최신 PIO_APC_ROUTINE을 사용할 수 있어야합니다. MSDN은 "Windows 버전 검사를 수행하지 마십시오"라고 말하지만 새로운 인수가있는 버전 집합은 iphlpapi.dll에 함수가있는 버전 집합과 동일하지 않기 때문에 필자와 같이 보입니다.

이 기능과 APC를 사용하는 추가 문서 또는 작업 코드에 대한 포인터는 많은 도움이됩니다.

원시 소켓 또는 IcmpCreateFile + WriteFileEx + ReadFileEx의 일부 조합을 사용하는 것이 잘못된 경우 완전히 알려주십시오.

답변

1

나는 콜백이 아닌 이벤트와 함께 IcmpSendEcho2을 사용하지만, 두 경우 모두 흐름이 같다고 생각합니다. IcmpSendEcho2은 내부적으로 NtDeviceIoControlFile을 사용합니다. ICMP 관련 오류를 일찍 감지하여 12xx 범위의 오류 코드로 반환합니다. IcmpSendEcho2ERROR_IO_PENDING을 반환하면 핑이 성공했는지, 실패했는지 또는 시간 초과되는지에 관계없이 에 관계없이 콜백을 호출하거나 이벤트를 설정합니다 (). 그 때까지 전달한 모든 버퍼는 보존되어야하지만 나중에 다시 사용할 수 있습니다.

버전 확인은 APC 콜백 대신 RegisterWaitForSingleObject 이벤트를 사용하여 약간의 비용을 지불하면 피할 수 있습니다.

+0

이벤트, 콜백 함수 및 제한 시간과 함께 호출 된 IcmpSendEcho2Ex에 대한 경험으로는 문서화 된 Vista 스타일 콜백이 호출 될 수 있지만 XP 스타일 콜백에 대한 유일한 유효한 인수가 있습니다. 이벤트가 아직 시작되지 않은 경우 제한 시간이 만료 될 때까지 메모리를 보존합니다. 요청을 취소하는 _safe_ 방법이없는 것으로 보입니다. 자세한 내용은 다음 페이지를 참조하십시오. https://groups.google.com/forum/#!topic/microsoft.public.win32.programmer.networks/Kyi5lKgGdxM –

관련 문제