Condividi tramite


Operazioni pipe denominate

La prima volta che il server pipe chiama la funzione CreateNamedPipe , usa il parametro nMaxInstances per specificare il numero massimo di istanze della pipe che possono esistere simultaneamente. Il server può chiamare ripetutamente CreateNamedPipe per creare istanze aggiuntive della pipe, purché non superi il numero massimo di istanze. Se la funzione ha esito positivo, ogni chiamata restituisce un handle alla fine del server di un'istanza della pipe denominata.

Non appena il server di pipe crea un'istanza di pipe, un client pipe può connettersi chiamando la funzione CreateFile o CallNamedPipe . Se è disponibile un'istanza della pipe, CreateFile restituisce un handle alla fine del client dell'istanza della pipe. Se non sono disponibili istanze della pipe, un client di pipe può usare la funzione WaitNamedPipe per attendere fino a quando non diventa disponibile una pipe.

Un server pipe può determinare quando un client di pipe è connesso a un'istanza della pipe chiamando la funzione ConnectNamedPipe . Se l'handle della pipe è in modalità di attesa di blocco, ConnectNamedPipe non restituisce finché non viene connesso un client.

I client e i server di pipe possono chiamare una di diverse funzioni, oltre a CallNamedPipe , per leggere e scrivere in una pipe denominata. Il comportamento di queste funzioni dipende dal tipo di pipe e dalle modalità in vigore per l'handle della pipe specificato, come indicato di seguito:

  • Le funzioni ReadFile e WriteFile possono essere usate con pipe di tipo byte o di tipo messaggio.
  • Le funzioni ReadFileEx e WriteFileEx possono essere usate con pipe di tipo byte o di tipo messaggio se l'handle della pipe è stato aperto per operazioni sovrapposte.
  • La funzione PeekNamedPipe può essere usata per leggere senza rimuovere il contenuto di una pipe di tipo byte o di una pipe di tipo messaggio. PeekNamedPipe può anche restituire informazioni aggiuntive sull'istanza della pipe.
  • La funzione TransactNamedPipe può essere usata con pipe duplex di tipo messaggio se l'handle della pipe al processo di chiamata è impostato sulla modalità di lettura dei messaggi. La funzione scrive un messaggio di richiesta e legge un messaggio di risposta in una singola operazione, migliorando le prestazioni di rete.

Il server pipe non deve eseguire un'operazione di lettura di blocco fino all'avvio del client della pipe. In caso contrario, può verificarsi una condizione di gara. Ciò si verifica in genere quando il codice di inizializzazione, ad esempio quello della libreria di runtime C, deve bloccare ed esaminare handle ereditati.

Al termine dell'uso di un'istanza del client e del server, il server deve prima chiamare la funzione FlushFileBuffers per assicurarsi che tutti i byte o i messaggi scritti nella pipe vengano letti dal client. FlushFileBuffers non restituisce finché il client non ha letto tutti i dati dalla pipe. Il server chiama quindi la funzione DisconnectNamedPipe per chiudere la connessione al client pipe. Questa funzione rende non valido l'handle del client, se non è già stato chiuso. Tutti i dati non letti nella pipe vengono rimossi. Dopo la disconnessione del client, il server chiama la funzione CloseHandle per chiudere il relativo handle all'istanza della pipe. In alternativa, il server può usare ConnectNamedPipe per consentire a un nuovo client di connettersi a questa istanza della pipe.

Un processo può recuperare informazioni su una pipe denominata chiamando la funzione GetNamedPipeInfo , che restituisce il tipo della pipe, le dimensioni dei buffer di input e di output e il numero massimo di istanze della pipe che possono essere create. La funzione GetNamedPipeHandleState segnala le modalità di lettura e attesa di un handle pipe, il numero corrente di istanze della pipe e informazioni aggiuntive per le pipe che comunicano su una rete. La funzione SetNamedPipeHandleState imposta le modalità di lettura e attesa di un handle pipe. Per i client pipe che comunicano con un server remoto, la funzione controlla anche il numero massimo di byte da raccogliere o il tempo massimo di attesa prima di trasmettere un messaggio (presupponendo che l'handle del client non sia stato aperto con la modalità write-through abilitata).