具名管道作業
第一次使用管道伺服器呼叫 CreateNamedPipe 函式時,它會使用 nMaxInstances 參數來指定可以同時存在的管道實例數目上限。 只要未超過實例數目上限,伺服器就可以重複呼叫 CreateNamedPipe 來建立管道的其他實例。 如果函式成功,則每個呼叫都會傳回具名管道實例伺服器端的控制碼。
只要管道伺服器建立管道實例,管道用戶端就可以藉由呼叫 CreateFile 或 CallNamedPipe 函式來連線到該實例。 如果管道實例可用, CreateFile 會將控制碼傳回至管道實例的用戶端端。 如果沒有可用的管道實例,管道用戶端可以使用 WaitNamedPipe 函式等候管道,直到管道變成可用為止。
管道伺服器可以藉由呼叫 ConnectNamedPipe 函式來判斷管道用戶端何時連接到管道實例。 如果管道控制碼處於封鎖等候模式, ConnectNamedPipe 在連線用戶端之前不會傳回。
管道用戶端和伺服器除了 CallNamedPipe 之外,還可以呼叫數個函式之一,以讀取和寫入具名管道。 這些函式的行為取決於管道類型,以及指定管道控制碼生效的模式,如下所示:
- ReadFile和WriteFile函式可以與位元組類型或訊息類型管道搭配使用。
- 如果管道控制碼已針對重迭的作業開啟, ReadFileEx 和 WriteFileEx 函式可以與位元組類型或訊息類型管道搭配使用。
- PeekNamedPipe函式可用來讀取,而不需要移除位元組類型管道或訊息類型管道的內容。 PeekNamedPipe 也可以傳回管道實例的其他資訊。
- 如果呼叫進程的管道控制碼設定為訊息讀取模式, TransactNamedPipe 函式可以與訊息類型雙工管道搭配使用。 函式會寫入要求訊息,並在單一作業中讀取回復訊息,以增強網路效能。
管道伺服器不應該執行封鎖讀取作業,直到管道用戶端啟動為止。 否則,可能會發生競爭狀況。 這通常會發生在初始化程式碼,例如 C 執行時間程式庫的初始化程式碼時,需要鎖定並檢查繼承的控制碼。
當用戶端和伺服器使用管道實例完成時,伺服器應該先呼叫 FlushFileBuffers 函 式,以確保用戶端會讀取寫入管道的所有位元組或訊息。 FlushFileBuffers 不會傳回,直到用戶端從管道讀取所有資料為止。 然後,伺服器會呼叫 DisconnectNamedPipe 函式,以關閉與管道用戶端的連線。 如果尚未關閉,此函式會使用戶端的控制碼無效。 管線中的任何未讀取資料會捨棄。 用戶端中斷連線之後,伺服器會呼叫 CloseHandle 函式,將其控制碼關閉至管道實例。 或者,伺服器可以使用 ConnectNamedPipe ,讓新的用戶端連接到管道的這個實例。
進程可以藉由呼叫 GetNamedPipeInfo 函式來擷取具名管道的相關資訊,它會傳回管道的類型、輸入和輸出緩衝區的大小,以及可建立的管道實例數目上限。 GetNamedPipeHandleState函式會報告管道控制碼的讀取和等候模式、目前的管道實例數目,以及透過網路通訊管道的其他資訊。 SetNamedPipeHandleState函式會設定管道控制碼的讀取模式和等候模式。 對於與遠端伺服器通訊的管道用戶端,函式也會控制要收集的位元組數目上限,或控制在傳輸訊息之前等待的時間上限, (假設用戶端的控制碼未以啟用寫入模式開啟) 。