Delen via


Benoemde pijpbewerkingen

De eerste keer dat de pijpserver de functie CreateNamedPipe aanroept, wordt de parameter nMaxInstances gebruikt om het maximum aantal exemplaren van de pijp op te geven dat tegelijkertijd kan bestaan. De server kan CreateNamedPipe herhaaldelijk aanroepen om extra exemplaren van de pijp te maken, zolang deze het maximum aantal exemplaren niet overschrijdt. Als de functie slaagt, retourneert elke aanroep een ingang naar het servereinde van een benoemd pipe-exemplaar.

Zodra de pipe-server een pijpexemplaren maakt, kan er een pipe-client verbinding mee maken door de functie CreateFile of CallNamedPipe aan te roepen. Als er een pijpexemplaren beschikbaar zijn, retourneert CreateFile een ingang naar het clienteinde van het pijpexemplaren. Als er geen exemplaren van de pijp beschikbaar zijn, kan een pijpclient de functie WaitNamedPipe gebruiken om te wachten totdat er een pijp beschikbaar is.

Een pijpserver kan bepalen wanneer een pijpclient is verbonden met een pijpexemplaren door de ConnectNamedPipe--functie aan te roepen. Als de pijpgreep zich in de blokkeringswachtmodus bevindt, wordt ConnectNamedPipe- niet geretourneerd totdat een client is verbonden.

Pipe-clients en -servers kunnen een van de verschillende functies aanroepen, naast CallNamedPipe-, om van en naar een benoemde pijp te lezen en schrijven. Het gedrag van deze functies is afhankelijk van het type pijp en de modi die van kracht zijn voor de opgegeven pijpgreep, als volgt:

  • De functies ReadFile en WriteFile kunnen worden gebruikt met byte- of message-type pipes.
  • De functies ReadFileEx en WriteFileEx kunnen worden gebruikt met byte- of message-type pipes als de pijpgreep is geopend voor overlappende bewerkingen.
  • De functie PeekNamedPipe kan worden gebruikt om te lezen zonder de inhoud van een byte-type pipe of een berichtpijp te verwijderen. PeekNamedPipe- kan ook aanvullende informatie over het pijpexemplaren retourneren.
  • De functie TransactNamedPipe kan worden gebruikt met duplex-leidingen van het berichttype als de pijpgreep voor het aanroepende proces is ingesteld op de berichtenleesmodus. De functie schrijft een aanvraagbericht en leest een antwoordbericht in één bewerking, waardoor de netwerkprestaties worden verbeterd.

De pijpserver mag geen blokkerende leesbewerking uitvoeren totdat de pijpclient is gestart. Anders kan er een racevoorwaarde optreden. Dit gebeurt meestal wanneer initialisatiecode, zoals die van de C-runtimebibliotheek, overgenomen ingangen moet vergrendelen en onderzoeken.

Wanneer een client en server klaar zijn met een pipe-exemplaar, moet de server eerst de FlushFileBuffers functie aanroepen om ervoor te zorgen dat alle bytes of berichten die naar de pijp worden geschreven, door de client worden gelezen. FlushFileBuffers niet retourneert totdat de client alle gegevens uit de pijp heeft gelezen. De server roept vervolgens de DisconnectNamedPipe--functie aan om de verbinding met de pijpclient te sluiten. Deze functie maakt de ingang van de client ongeldig als deze nog niet is gesloten. Ongelezen gegevens in de pijp worden verwijderd. Nadat de verbinding met de client is verbroken, roept de server de CloseHandle--functie aan om de ingang van de pijpinstantie te sluiten. De server kan ook ConnectNamedPipe- gebruiken om een nieuwe client in staat te stellen verbinding te maken met dit exemplaar van de pijp.

Een proces kan informatie over een benoemde pijp ophalen door de GetNamedPipeInfo aan te roepen functie, die het type van de pijp, de grootte van de invoer- en uitvoerbuffers retourneert en het maximum aantal pijpexemplaren dat kan worden gemaakt. De GetNamedPipeHandleState functie rapporteert over de lees- en wachtmodi van een pijpgreep, het huidige aantal pijpexemplaren en aanvullende informatie voor pijpen die communiceren via een netwerk. De functie SetNamedPipeHandleState stelt de leesmodus en wachtmodi van een pijpgreep in. Voor pijpclients die communiceren met een externe server, bepaalt de functie ook het maximum aantal bytes dat moet worden verzameld of de maximale tijd die moet worden gewacht voordat een bericht wordt verzonden (ervan uitgaande dat de ingang van de client niet is geopend met de schrijfmodus ingeschakeld).