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