Operazioni named pipe
La prima volta che il server pipe chiama la funzione diCreateNamedPipe, usa il parametro nMaxInstances per specificare il numero massimo di istanze della pipe che possono esistere contemporaneamente. Il server può chiamare CreateNamedPipe ripetutamente 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 named pipe.
Non appena il server pipe crea un'istanza della pipe, un client pipe può connettersi chiamando la funzioneCreateFileoCallNamedPipe. Se è disponibile un'istanza della pipe, CreateFile restituisce un handle alla fine client dell'istanza della pipe. Se non sono disponibili istanze della pipe, un client pipe può usare la funzioneWaitNamedPipeper attendere che una pipe diventi disponibile.
Un server pipe può determinare quando un client pipe è connesso a un'istanza di pipe chiamando la funzione ConnectNamedPipe. Se l'handle pipe è in modalità di attesa di blocco, ConnectNamedPipe non restituisce finché non viene connesso un client.
I client e i server pipe possono chiamare una delle diverse funzioni, oltre a CallNamedPipe, per leggere e scrivere in una named pipe. Il comportamento di queste funzioni dipende dal tipo di pipe e dalle modalità applicate per l'handle 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 message-type se l'handle della pipe è stato aperto per le operazioni sovrapposte.
- La funzionepeekNamedPipepuò essere usata per leggere senza rimuovere il contenuto di una pipe di tipo byte o di una pipe di tipo messaggio. peekNamedPipe può restituire anche informazioni aggiuntive sull'istanza della pipe.
- La funzioneTransactNamedPipepuò essere usata con pipe duplex di tipo messaggio se l'handle pipe al processo chiamante è impostato sulla modalità di lettura messaggio. La funzione scrive un messaggio di richiesta e legge un messaggio di risposta in un'unica operazione, migliorando le prestazioni di rete.
Il server pipe non deve eseguire un'operazione di lettura di blocco fino all'avvio del client pipe. In caso contrario, può verificarsi una race condition. Ciò si verifica in genere quando il codice di inizializzazione, ad esempio quello della libreria di runtime C, deve bloccare ed esaminare gli handle ereditati.
Quando un client e un server terminano l'uso di un'istanza pipe, il server deve prima chiamare la funzioneFlushFileBuffers, 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 funzionedisconnectnamedPipeper chiudere la connessione al client pipe. Questa funzione rende l'handle del client non valido, se non è già stato chiuso. Tutti i dati non letti nella pipe vengono eliminati. Dopo la disconnessione del client, il server chiama la funzioneclosehandleper chiudere l'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 named pipe 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 pipe che è possibile creare. La funzione GetNamedPipeHandleState segnala le modalità di lettura e attesa di un handle pipe, il numero corrente di istanze pipe e informazioni aggiuntive per le pipe che comunicano in rete. La funzione SetNamedPipeHandleState imposta le modalità di lettura e attesa di un handle pipe. Per i client di 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).