2012-06-04 3 views
1

Windows 플랫폼의 서버 측에서 클라이언트 파이프의 핸들 상태를 감지하는 방법이 있는지 궁금합니다.NamedPipe를 사용할 때 클라이언트 파이프의 핸들이 닫혀 있는지 여부를 감지 할 수있는 방법이 있습니까?

클라이언트가 CloseHandle() 기능으로 파이프를 (연결이 끊긴) 닫았지만 서버 측에서 감지 할 수있는 방법이없는 것 같습니다.

핸들 개체와 함께 WaitForSingleObject()을 사용하면 클라이언트 핸들 상태에 관계없이 WAIT_OBJECT_0을 반환합니다. 그렇다면 클라이언트 파이프의 핸들이 비용이 적게 드는 서버 쪽에서 닫혔는지 여부를 확인하는 좋은 해결책은 무엇입니까?

답변

2

파이프 (PIPE_ACCESS_INBOUND 또는 PIPE_ACCESS_DUPLEX)에서 데이터를 읽는 경우 클라이언트가 파이프 끝을 닫으면 ERROR_BROKEN_PIPE이 표시됩니다. 파이프에서 데이터를 처리 할 준비가되어 있지 않더라도 파이프가 손상되었을 때이를 감지하기 위해 미리 비동기식 I/O를 사용하여 읽을 수 있습니다.

파이프의 클라이언트 쪽 핸들이 둘 이상이면 마지막 핸들이 닫힐 때만 닫힌 것으로 간주됩니다. 예를 들어, 클라이언트가 부주의로 인해 서브 프로세스가 핸들 사본을 상속하게되는 경우에는 문제가 될 수 있습니다.

클라이언트가 데이터를 쓰지 않고 아웃 바운드 전용 파이프를 닫았 음을 감지하는 방법을 모르겠습니다. 가장 좋은 옵션은 파이프의 수신 측이 파이프가 손상되었을 때만 감지하는 경우에도 PIPE_ACCESS_DUPLEX을 사용하는 것입니다.

나중에 참조 할 수 있지만 핸들을 동기화 개체로 사용할 수는 있지만 그렇게하는 것은 좋지 않으며 지원되는 유일한 용도는 비동기 I/O 작업의 완료를 감지하는 것입니다. 지정되었습니다.

+0

이번에도 다시 한번 감사드립니다. 클라이언트가 닫고 (CreateFile) 파이프 핸들을 주기적으로 열리기 때문에 (현재) 연결 상태를 확인하기 위해 클라이언트 핸들을 확인하고 싶었습니다. 비동기 I/O 및 PIPE_ACCESS_DUPLEX를 사용하고 있지만이 방법이 중요하지 않을 수 있습니다. 따라서 파이프에서 데이터를 읽으려고하면 솔루션이 될 수 있다는 의미입니까? – ToBeSpecific

+0

예, 읽기 요청을 발행하고 데이터를 기다리는 경우 클라이언트가 파이프 끝을 닫 자마자 요청이 실패합니다 (ERROR_BROKEN_PIPE). –

+0

잘 작동합니다. 답변 주셔서 감사합니다. – ToBeSpecific

관련 문제