명명된 파이프 작업
파이프 서버가 CreateNamedPipe 함수를 처음 호출할 때 nMaxInstances 매개 변수를 사용하여 동시에 존재할 수 있는 파이프의 최대 인스턴스 수를 지정합니다. 서버는 최대 인스턴스 수를 초과하지 않는 한 CreateNamedPipe 를 반복적으로 호출하여 파이프의 추가 인스턴스를 만들 수 있습니다. 함수가 성공하면 각 호출은 명명된 파이프 instance 서버 끝에 대한 핸들을 반환합니다.
파이프 서버가 파이프 instance 만드는 즉시 파이프 클라이언트는 CreateFile 또는 CallNamedPipe 함수를 호출하여 연결할 수 있습니다. 파이프 instance 사용할 수 있는 경우 CreateFile은 파이프 instance 클라이언트 끝에 핸들을 반환합니다. 파이프 인스턴스를 사용할 수 없는 경우 파이프 클라이언트는 WaitNamedPipe 함수를 사용하여 파이프를 사용할 수 있게 될 때까지 기다릴 수 있습니다.
파이프 서버는 ConnectNamedPipe 함수를 호출하여 파이프 클라이언트가 파이프 instance 연결된 시기를 확인할 수 있습니다. 파이프 핸들이 차단 대기 모드인 경우 ConnectNamedPipe 는 클라이언트가 연결될 때까지 반환되지 않습니다.
파이프 클라이언트와 서버는 CallNamedPipe 외에도 여러 함수 중 하나를 호출하여 명명된 파이프에서 읽고 쓸 수 있습니다. 이러한 함수의 동작은 다음과 같이 파이프 유형 및 지정된 파이프 핸들에 적용되는 모드에 따라 달라집니다.
- ReadFile 및 WriteFile 함수는 바이트 형식 또는 메시지 형식 파이프와 함께 사용할 수 있습니다.
- 겹치는 작업을 위해 파이프 핸들을 연 경우 ReadFileEx 및 WriteFileEx 함수를 바이트 형식 또는 메시지 형식 파이프와 함께 사용할 수 있습니다.
- PeekNamedPipe 함수를 사용하여 바이트 형식 파이프 또는 메시지 형식 파이프의 내용을 제거하지 않고 읽을 수 있습니다. PeekNamedPipe는 파이프 instance 대한 추가 정보를 반환할 수도 있습니다.
- 호출 프로세스에 대한 파이프 핸들이 메시지 읽기 모드로 설정된 경우 TransactNamedPipe 함수를 메시지 형식 이중 파이프와 함께 사용할 수 있습니다. 함수는 요청 메시지를 작성하고 단일 작업에서 회신 메시지를 읽어 네트워크 성능을 향상합니다.
파이프 서버는 파이프 클라이언트가 시작될 때까지 읽기 차단 작업을 수행해서는 안 됩니다. 그렇지 않으면 경합 상태가 발생할 수 있습니다. 이는 일반적으로 C 런타임 라이브러리와 같은 초기화 코드가 상속된 핸들을 잠그고 검사해야 하는 경우에 발생합니다.
파이프 instance 사용하여 클라이언트와 서버가 완료되면 서버는 먼저 FlushFileBuffers 함수를 호출하여 파이프에 기록된 모든 바이트 또는 메시지를 클라이언트에서 읽도록 해야 합니다. FlushFileBuffers 는 클라이언트가 파이프에서 모든 데이터를 읽을 때까지 반환되지 않습니다. 그런 다음 서버는 DisconnectNamedPipe 함수를 호출하여 파이프 클라이언트에 대한 연결을 닫습니다. 이 함수는 클라이언트의 핸들이 아직 닫혀 있지 않은 경우 유효하지 않은 핸들을 만듭니다. 파이프의 읽지 않은 데이터는 모두 삭제됩니다. 클라이언트의 연결이 끊긴 후 서버는 CloseHandle 함수를 호출하여 파이프 instance 대한 핸들을 닫습니다. 또는 서버에서 ConnectNamedPipe를 사용하여 새 클라이언트가 파이프의 이 instance 연결할 수 있도록 할 수 있습니다.
프로세스는 파이프 형식, 입력 및 출력 버퍼의 크기 및 만들 수 있는 최대 파이프 인스턴스 수를 반환하는 GetNamedPipeInfo 함수를 호출하여 명명된 파이프에 대한 정보를 검색할 수 있습니다. GetNamedPipeHandleState 함수는 파이프 핸들의 읽기 및 대기 모드, 현재 파이프 인스턴스 수 및 네트워크를 통해 통신하는 파이프에 대한 추가 정보를 보고합니다. SetNamedPipeHandleState 함수는 파이프 핸들의 읽기 모드 및 대기 모드를 설정합니다. 원격 서버와 통신하는 파이프 클라이언트의 경우 함수는 수집할 최대 바이트 수 또는 메시지를 전송하기 전에 대기할 최대 시간을 제어합니다(클라이언트의 핸들이 쓰기 모드를 사용하도록 설정된 상태에서 열리지 않았다고 가정).